我想做的事情:
如果用户在调用您的函数时指定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
但是仍然没有得到回文数或回序数的回文数。
答案 0 :(得分:4)
x[::-1]
不适用于某个数字:
>>> 42[::-1]
TypeError: 'int' object has no attribute '__getitem__'
您需要将其转换为字符串,将其反转,然后将其转换回int
:
>>> int(str(42)[::-1])
24
其次,行
x==x+x[::-1]
绝对没有。不要混淆=
和==
答案 1 :(得分:2)
类似的东西:
def algo(r,ret_len=None):
count=0
while 1:
r=str(r)
if r==r[::-1]:
break
else:
count+=1
r=int(r)+int(r[::-1])
return count+1 if ret_len else r
print (algo(5280,True))
print (algo(5280))
print (algo(89,True))
print (algo(89))
<强>输出:强>
4
23232
25
8813200023188
答案 2 :(得分:1)
您无法获得整数的“切片”。首先,您需要将其转换为字符串。 x[::-1]
&lt; - 如果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