解题思路:

    题目:

考虑以下生成数字序列的算法。从整数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在相同的顺序出现在输入然后最大周期长度之间的整数,包括我和j。这三个号码应该由一个空间,与所有三个数字在一行,一行输出输入的每一行。


【来自有道翻译】




大致意思就是,输入两个数,a,b然后找到a,b之间的最大序列数,

例如:

10 : 10 5 16 8 4 2 1            有7个数

9 : 9 28 14 7 22 11 34 17  52  26 13 40 20 10 5 16 8 4 2 1        有20个数

8 : 8  4  2  1   有4个数


所以

输入 10   8  的话,那10 和 8之间的最大序列数应该是9 的,有20个,   所以 10 到 8 之间的最大序列数为 20



理解了这些之后就好办了



参考代码:

#include <stdio.h>
int main()
{
    int a, b, max, min, now;//now表示现在的序列数的个数
    while (~scanf("%d%d", &a, &b))
    {
        printf("%d %d ", a, b);
        max = a > b ? a : b;
        min = a < b ? a : b;//找到a,b之间的最大的数
        int max_number = 0;//最大的个数
        for (int i = min, temp = min; i <= max; temp = ++i )//temp是用来临时保存i的值,避免i的值被弄乱
        {                                                   //temp = ++i 表示i先加1,然后再把i赋值给temp,可以拆分为:①i++;②temp = i;
            now = 1;//一开始原本的数是序列中的第一个数
            while (temp != 1)
            {
                if (temp & 1)
                    temp = temp * 3 + 1;
                else
                    temp /= 2;
                now++;
            }
            max_number = max_number > now ? max_number : now;
        }
        printf("%d\n", max_number);
    }
    return 0;
}


点赞(0)
 

0.0分

8 人评分

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

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

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

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

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

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

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

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

评论列表 共有 6 条评论

渴望学到知识的菜鸟 3年前 回复TA
@小王编程 应该是没定义就用了吧,如果是定义的全局变量的话,其实没有影响
渴望学到知识的菜鸟 3年前 回复TA
@miss 谢谢
渴望学到知识的菜鸟 3年前 回复TA
@并不 循环条件 ,n = i ; n <= j ; n ++  这里的前提是 i <= j ,不然一次循环都不会进行
并不 3年前 回复TA
#include<stdio.h>
int main()
{
    int i,n,j,max=0,count;
    long long k;
    while(scanf("%d %d",&i,&j)!=EOF)
    {
    for(n=i;n<=j;n++)
    {   k=n;
        count=1;
        while(k!=1)
        {
            if(k%2==0)
            {   count++;
                k/=2;
            }
            else
            {   count++;
                k=k*3+1;
            }

        }
        if(max<=count)
        {
            max=count;
        }
    }
    printf("%d %d ",i,j);
    printf("%d ",max);
    }
    return 0;
}
这样怎不行
小王编程 3年前 回复TA
为什么max-number定义在外面就错了
miss 3年前 回复TA
好棒,向你学习