3

我正在尝试做的事情:

  1. 如果用户return_length=True在调用您的函数时指定,它应该返回一加算法达到回文数所需的步数。例如,输入 5280 和return_length=True,您的函数应返回 4(请注意,这是序列 [5280, 6105, 11121, 23232] 中的条目总数)。例如,输入 11,函数应该返回 1,因为它已经是一个回文数。

  2. 如果用户没有指定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

但是仍然没有得到回文数或回文数的序列。

4

3 回答 3

4

x[::-1]不适用于数字:

>>> 42[::-1]
TypeError: 'int' object has no attribute '__getitem__'

您需要将其转换为字符串,将其反转,然后将其转换回int

>>> int(str(42)[::-1])
24

其次,线

x==x+x[::-1]

绝对什么都不做。不要混淆===

于 2012-11-13T20:33:03.513 回答
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
于 2012-11-13T20:39:44.397 回答
1

您无法获得整数的“切片”。首先,您需要将其转换为字符串。 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
于 2012-11-13T20:34:20.127 回答