问题描述
科拉茨序列描述:我们可以选定一个初始数X并以下列规则进行延续排列,直到数为1
if X is even (i.e. X modulo 2 = 0) then
Xnext = X / 2
else
Xnext = 3 * X + 1
例如15以下列顺序排列
15 46 23 70 35 106 53 160 80 40 20 10 5 16 8 4 2 1
目的:计算结果到1所需要的步数
输入数:第一行包含总共数的个数
第二行含需要被计算的数
输出:各个数计算到1所需的步数。
例:
input data:
3
2 15 97
answer:
1 17 118
问题解决
解题思路
第一步:第一行包含总共数的个数, 第二行含需要被计算的数
第二步:对第二行所有数进行第三步遍历循环
第三步:判断数是否为1,是1退出循环,并将次数加入结果列表,否进行第四步
第四步:判断是否为偶数,偶数/2,奇数*3+1,并且count+1,完成后进行第三步判断。
4输出结果列表
代码
lineInput=input()
lineInput2=list(map(int,input().split()))
result=[]
for i in range(int(lineInput)):
count=0
while lineInput2[i]!=1:
if lineInput2[i]%2==0:
lineInput2[i] /=2
count+=1
else:
lineInput2[i]=lineInput2[i]*3+1
count+=1
result.append(count)
print(*result
方法二
def collatz_sequence():
def cs(number):
n = float(number)
steps = 0
while n != 1:
if n % 2 == 0:
n = n / 2
else:
n = 3 * n + 1
steps += 1
return steps
seq = raw_input("Enter number sequence: ").split()
seq = [str(cs(float(x))) for x in seq]
return " ".join(seq)
seq = [str(cs(float(x))) for x in seq]
这一行有学习意义,对列表中每个元素遍历循环并使用函数。