2012-10-01 37 views
0

開心號碼是由以下過程定義的。從任何正整數開始,用數字的平方和替換數字,然後重複該過程直到數字等於1.何時停止當號碼不是開心號碼

但是,當數字不是一個快樂的數字時,它會在一個循環中無限循環包括1.

我已經編碼在Python中的幸福數字問題,但問題是當一個數字不開心,那麼我怎麼能停止迭代週期。因爲它不會以1結尾,並且會不斷重複。

def happynumber(number): 

while(number!=1): 
    numberstr = str(number) #converting a number to string 
    index=0 
    sum=0 
    while(index!=len(numberstr)): 
     sum = sum + int(numberstr[index])*int(numberstr[index]) 
     index = index+1 
    print sum 

    number = sum 
return number 
+1

你能告訴我們你做了什麼嗎? –

+0

你必須想辦法檢測週期並破壞它。這應該足以作爲功課的提示。 ;) –

+0

序列在重複或達到1之前會有多長時間? (我想不會,在這種情況下,這是一個難題。) –

回答

11

您可以使用恆定的內存量檢測不愉快的數字。根據Wikipedia,對於任何正整數起點,序列將終止於1,或永遠循環在4, 16, 37, 58, 89, 145, 42, 20, 4。由於沒有其他循環存在,很容易測試不快樂。

def isHappy(x): 
    while True: 
     if x == 1: 
      return True 
     if x == 4: 
      return False 
     x = nextNumberInSequence(x) 
7

你必須保持你的順序至今生產的所有號碼的記錄,如果其中一人的時候,您知道第二次你有一個循環,這將永遠不會達到1。 set可能是存儲數字的地方的不錯選擇。

+3

...或已存儲號碼的10的倍數... –

+1

我認爲這是教學目的的最佳答案,因爲它是最普通的,並且對幸福數字的特定屬性影響最小。 – DSM

+0

@PierreGM:如果在步驟'i'獲得10倍於步驟'j'的值的功率,那麼步驟'i + 1'將等於步驟'j + 1',這是來自先前的另一個數字序列。所以沒有必要專門研究這種情況,你可以再等一步,然後找到循環。 –

1

只要當前數字超過3位數字,下一次迭代的值就會減少。當這個數字有3位數字時,它在下一次迭代中可以使用的最大值是3 * 81 < = 250.所以使用一個大小爲250的數組,並記錄序列中小於250的所有數字。然後可以很容易地檢測你是否有重複。

+0

Python的整數類型是任意精度的。 – DSM

+0

@DSM謝謝!我不知道。修復了我的答案,照顧它。 – krjampani