196算法,功能可选输入

时间:2012-11-13 20:27:57

标签: python function

我想做的事情:

  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。

  3. 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
    

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

3 个答案:

答案 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