角谷靜夫是日本的一位學者,他提出了兩條極簡單的規則,可以對任何一個自然數進行變換,最終使它陷入"4-2-1"的死循環。以一個正整數n為例,如果n為偶數,就將它變為n/2,如果除后變為奇數,則將它乘3加1(即3n+1)。不斷重復這樣的運算,經過有限步后,一定可以得到1。這就是角谷猜想。人們通過大量的驗算,從來沒有發現反例。
輸入一個正整數,若為偶數,則把它除以2,若為大於1的奇數,則把它乘以3加1。經過如此有限次運算后,可以得到數值1.求經過多少次可得到數1.第一行依次輸出從n開始每步得運算結果,第二行輸出總得運算次數,如輸入數據不是正整數,輸出“ERROR”。
分析題目
輸入一個正整數(input),若為偶數(n%2=0),則把它除以2,若為大於1的奇數(n%2=1),則把它乘以3加1。經過如此有限次運算(使用循環)后,可以得到數值1。求經過多少次可得到數1。第一行依次輸出從n開始每步得運算結果(考慮使用列表來存數據),第二行輸出總得運算次數(累加的算法),如輸入數據不是正整數,輸出“ERROR”。(分情況:需要用到分支語句if - else)
代碼實現
def even(n):
if n%2 == 0:
return 1
else:
return 0
#even函數是用來判斷輸入的數是否是偶數的,若是偶數返回1(布爾值為真),若是奇數返回0(布爾值為假)
n = int(input())
if n >= 1:
#先分析大於等於1的正整數的情況
ls = [n]
#列表用來存放輸出的第一行,即n本身和每次運算的結果
m = 0
#m用來統計計算的次數
while(n != 1):
#設置循環的條件,當n=1的時候就不再循環了
if even(n):
n = int(n/2)
#用int()是因為輸出時需要的是整型而不是浮點型
else:
n = int(n*3+1)
#用int()是因為輸出時需要的是整型而不是浮點型
ls.append(n)
m = m + 1
print(','.join(str(i) for i in ls))
#以字符形式輸出列表中的每一個元素
print(m)
else:
#當輸入的不是正整數的情形
print("ERROR")
涉及知識點
1.分支語句(if-else)
2.循環語句(while或者for i in s)以及循環條件的設置
3.數據的存儲與輸出(列表的使用和join的使用)