解题思路:
题目:
考虑以下生成数字序列的算法。从整数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、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复