解题思路:
首先咱们得知道题目是什么意思:
题目描述
考虑下面的算法来生成一个数字序列。从整数n开始。如果n是偶数,除以2。如果n是奇数,乘以3加1。用n的新值重复这个过程,当n=1时终止。例如,以下序列将生成n=22:22=11-34-52-26-13-40-17-20-10-5-16-8-4-2-1-推测(但尚未证明)该算法将以n=1为每个整数n终止.尽管如此,该猜想仍然适用于至少1, 000,000的所有整数。对于输入n,n的循环长度是生成并包括1的数的个数。在上面的例子中,22的循环长度是16。给定任意两个数字i和j,您将确定i和j之间所有数字的最大循环长度,包括两个端点。
输入
输入将由一对整数i和j组成,每行一对整数。所有的整数都小于1000000,大于0。
输出
对于每一对输入的整数i和j,输出I、J在相同的顺序出现在输入然后整数之间的最大周期长度和包括我和J这三个数字由一个空格隔开,所有三个数字一行,在每一行输入输出。
参考代码:
#include<stdio.h> int main() { int i,j,k,s,t,max; while(scanf("%d%d",&i,&j)==2) { printf("%d %d ",i,j); // 先把i和j输出 if(i>j){max=i;i=j;j=max;} // 如果i大于j,交换他们的位置 max=0; for(k=i;k<=j;k++) { s=0; //步数初始化 t=k; // while(t!=1) //知道t为1时结束 { if(t%2==0) //t是偶数 { t=t/2; //除以2 ++s; //循环步数加1 } else //奇数 { t=(3*t+1); //乘3加1 ++s; //循环步数加1 } } ++s; //循环步数加1 if(s>max) { max=s; } } printf("%d\n",max); // 补充最大值 } return 0; }
看看大家还有什么不懂得,请在下方评论区留言
0.0分
4 人评分
楼主,我想请问下,我这代码为啥会编译错误? #include<stdio.h> int mark(int n) { int count=1; while(n!=1) { if(n%2==0) n=n/2; else n=n*3+1; count++; } return count; } int main() { int i,j,temp,max,t;bool f=false; scanf("%d %d",&i,&j); if(i>j) { temp=i; i=j; j=temp; } max=mark(i); for(t=i+1;t<=j;t++) { if(max<mark(t)) max=mark(t); } if(f){ temp=i; i=j; j=temp; f=false; } printf("%d %d %d\n",i,j,max); return 0; }
楼主试一下包含113383,134379,138367等的数据,,会卡死。。233333333