解题思路:
首先咱们得知道题目是什么意思:

题目描述

考虑下面的算法来生成一个数字序列。从整数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;
}

看看大家还有什么不懂得,请在下方评论区留言

点赞(6)
 

0.0分

4 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 11 条评论

pingfan443 5年前 回复TA
@淳 525
鼬殇 5年前 回复TA
楼主们,过了吗?我很好奇
C123 5年前 回复TA
@ET 那怎样解决呢?楼主的代码好像也解决不了这个问题
qifeng 5年前 回复TA
@灭尽龙 好像是因为没有进行循环,这个代码在输入一次i和j后就退出了
5年前 回复TA
@ET @1104986125 both
5年前 回复TA
楼主测一下
1 1000000
wuff 6年前 回复TA
@灭尽龙 同问,不知道您现在弄懂了吗?
灭尽龙 6年前 回复TA
楼主,我想请问下,我这代码为啥会编译错误?
#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;
}
ET 7年前 回复TA
@ET 爆int了。。。23333333
Mister-小方 7年前 回复TA
@ET 是因为太大了吗,还是我算法不好