2012-11-13 28 views
3

什麼,我試圖做的:196算法,在功能可選輸入

  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,51221,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

我迄今爲止:我

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

我得到的錯誤完全解決這個問題或錯誤。

採取的一些信息的答案我有這個新的代碼:

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

基本上它使一個迴文數,要麼返回迴文或序列才能到迴文數。 – user1698174

回答

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) 

編輯

一個基於阿什維尼喬杜裏的代碼稍快的變化。上面的版本產生了一個結果列表,如果你想用中間數做一些事情,這很好。但是,我認爲以下功能是可讀性和速度之間的最佳折衷。但我不知道他爲什麼以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 
+0

我認爲在你的alg196函數中應該是'count = 0'。 – gsingh2011

4

x[::-1]

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

你需要將其轉換爲字符串,扭轉它,然後將其轉換回一個int:對一些不工作:

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

其次,線

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

絕對沒有。不要混淆===

+0

你的信息有幫助,並已擺脫我的錯誤,但現在我仍然沒有得到迴文數字。我的新代碼是: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 – user1698174

+0

@ user1698174:'str(x)+ str(x)[:: - 1]'不是你想要的。當'x'爲42時,則給出''42「+」24「==」4224「'。你想要'x + int(str(x)[:: - 1])''這會給出'42 + 24 = 66' – Eric

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