题目 1095: The 3n + 1 problem
时间限制: 1Sec 内存限制: 64MB 提交: 16005 解决: 4417
题目描述
请考虑以下算法以生成数字序列。以整数 n 开头。如果 n 为偶数,则除以 2。如果 n 为奇数,则乘以 3 并加 1。
使用新值 n 重复此过程,并在 n = 1 时终止。例如,将为 n = 22 生成以下数字序列:
22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1 推测(但尚未证明)对于每个整数 n,此算法将终止于 n = 1。
尽管如此,这个猜想仍然适用于至少1, 000, 000的所有整数。对于输入 n,n 的循环长度是生成的数量,最多包括 1。
在上面的示例中,循环长度 22 为 16。给定任意两个数字 i 和 j,您将确定 i 和 j 之间所有数字(包括两个端点)的最大循环长度。
输入
输入将由一系列整数对 i 和 j 组成,每行一对整数。所有整数将小于 1,000,000 且大于 0。
输出
对于每对输入整数 i 和 j,输出 i、j 的顺序与它们在输入中出现的顺序相同,然后是 i 和 j 之间整数的最大循环长度。这三个数字应用一个空格分隔,所有三个数字都在一行上,每行输入都有一行输出。
样例输入
1 10
100 200
201 210
900 1000
样例输出
1 10 20
100 200 125
201 210 89
900 1000 174*/
#includeint main() { long long int number,t1,t2,cnt,m,t,i; while(scanf("%lld %lld",&t1,&t2)!=EOF) { m=0;//注意放在这,如果不在这cnt的值可能赋值不到m中,当m的值比较大时 printf("%lld %lld ",t1,t2); if(t1>t2) { t=t1; t1=t2; t2=t; } for(i=t1;i<=t2;i++) { number=i;//必须要有,如果直接用i在while中则发生死循环 cnt=1; while(number!=1) { if(number%2==0) number=number/2; else number=number*3+1; cnt++; } if(cnt>m) m=cnt; } printf("%lldn",m); } return 0; }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)