解题思路:
题目:
考虑以下生成数字序列的算法。从整数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分
8 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
#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; } 这样怎不行