P5727 【深基5.例3】冰雹猜想
题目描述
给出一个正整数 n n n,然后对这个数字一直进行下面的操作:如果这个数字是奇数,那么将其乘 3 3 3 再加 1 1 1,否则除以 2 2 2。经过若干次循环后,最终都会回到 1 1 1。经过验证很大的数字( 7 × 10 11 7\times10^{11} 7×1011)都可以按照这样的方式比变成 1 1 1,所以被称为“冰雹猜想”。例如当 n n n 是 20 20 20,变化的过程是 20 → 10 → 5 → 16 → 8 → 4 → 2 → 1 20\to 10\to 5\to 16\to 8\to 4\to 2\to 1 20→10→5→16→8→4→2→1。
根据给定的数字,验证这个猜想,并从最后的 1 1 1 开始,倒序输出整个变化序列。
输入格式
输入一个正整数 n n n。
输出格式
输出若干个由空格隔开的正整数,表示从最后的 1 1 1 开始倒序的变化数列。
输入输出样例 #1
输入 #1
20
输出 #1
1 2 4 8 16 5 10 20
说明/提示
数据保证, 1 ≤ n ≤ 100 1 \le n\le 100 1≤n≤100。
思路分析及代码
一直处理直到n==1,所以循环条件时n!=1或n>1:
循环体:先把当前的值加到列表中,再对值进行处理(分支语句)
当n=1的时候结束了循环,没有执行加到列表这一句,所以,在循环结束后再加一下。
由于输出的顺序是从小到大的,先将列表逆反。
以空格分割输出列表中的元素,可以用join(),但它是针对字符串的,所以先把列表中的元素转为字符串。可以用map(str,num)或者[str(j) for j in num]
n=int(input())
num=[]
while n!=1:
num.append(n)
if n%2!=0:
n=n*3+1
else:
n=n//2
num.append(1)
num=num[::-1]
print(" ".join(map(str,num)))