原题链接:The 3n + 1 problem
解题思路:
首先咱们得知道题目是什么意思:
题目描述
考虑下面的算法来生成一个数字序列。从整数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 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
楼主,我想请问下,我这代码为啥会编译错误? #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; }