我想做什么:
>如果用户在调用函数时指定return_length = True,则应返回一个加上算法达到回文数所需的步数.例如,如果输入为5280且return_length = True,则您的函数应返回4(请注意,这是序列[5280,6105,11121,23232]中的条目总数).例如,输入为11时,该函数应返回1,因为它已经是一个回文数字.
>如果用户未指定return_length或指定return_length = False,则您的函数应返回算法终止的回文编号.例如,输入为5280时,算法应返回23232(整数,而不是字符串).同样,如果输入为89,则应返回整数8813200023188.
关于196算法的一些背景知识:
取两位数或更多的正整数,反转数字,并添加到原始数字.这是反向添加序列的操作.现在用所得的总和重复该过程,直到获得回文数.此过程可快速生成大多数整数的回文数.例如,从数字5280开始产生序列5280,6105,11121,23232.将算法应用于1,2,3 ……的最终结果是1,2,3,4,5,6,7 ,8,9,11,11,33,44,55,66,77,88,99,121,……(Sloane的A033865). 89的值特别大,为8813200023188.(自http://mathworld.wolfram.com/196-Algorithm.html起)
到目前为止我所拥有的:
def alg196(x, y = false):
if y==False:
while x == x[::-1]:
x==x+x[::-1]
return x
else:
seq = [x]
while x == x[::-1]:
x==x+x[::-1]
seq.append(x)
return seq
我收到错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "_sage_input_36.py", line 10, in <module>
exec compile(u"print _support_.syseval(python, u'alg196(34)', __SAGE_TMP_DIR__)" + '\n', '', 'single')
File "", line 1, in <module>
File "/sagenb/sage_install/sage-5.3-sage.math.washington.edu-x86_64-Linux/devel/sagenb-git/sagenb/misc/support.py", line 487, in syseval
return system.eval(cmd, sage_globals, locals = sage_globals)
File "/sagenb/sage_install/sage-5.3-sage.math.washington.edu-x86_64-Linux/local/lib/python2.7/site-packages/sage/misc/python.py", line 56, in eval
eval(z, globals)
File "", line 1, in <module>
File "", line 3, in alg196
TypeError: 'int' object has no attribute '__getitem__'
我不确定如何解决这个问题或错误.
获取一些有关答案的信息,我有这个新代码:
def alg196(x, y = false):
if y==False:
while str(x) == str(x)[::-1]:
x=str(x)+str(x)[::-1]
return x
else:
seq = [x]
while str(x) == str(x)[::-1]:
x = str(x)+str(x)[::-1]
seq.append(x)
return seq
但仍然没有得到回文数或回序数的回文数.
最佳答案 你无法获得整数的“切片”.首先,您需要将其转换为字符串. x [:: – 1]< – 如果x是整数,则此操作是非法的. 顺便说一句,这可以更好地编写为几个函数 – 执行计算的函数,以及在特定约束下运行函数的函数,并且接受return_length = True参数.
def reverse(n):
return int(str(n)[::-1])
def is_palindrome(n):
return str(n) == str(n)[::-1]
def alg196(n, return_length=False):
results = [n]
while not is_palindrome(results[-1]):
results.append(n + reverse(n))
n = results[-1]
return results[-1] if not return_length else len(results)
编辑
根据Ashwini Chaudhary的代码稍加快一点的变化.上面的版本会生成一个结果列表,如果你想用中间数字做一些事情,这很好.但是,我认为以下功能是可读性和速度之间的最佳折衷.我不知道为什么他从count = 0开始.
def alg196(n, return_length=False):
count = 1
while not is_palindrome(n):
n = n + reverse(n)
count += 1
return count if return_length else n