解题思路:
题目:
考虑以下生成数字序列的算法。从整数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 人评分
#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; } 这样怎不行
为什么max-number定义在外面就错了
渴望学到知识的菜鸟 2022-01-11 11:28:15 |
应该是没定义就用了吧,如果是定义的全局变量的话,其实没有影响
程序员的表白 (C语言代码)浏览:706 |
蛇行矩阵 (C语言代码)浏览:792 |
【矩阵】 (C++代码)浏览:999 |
Hello, world! (C++代码)浏览:1778 |
1009题解浏览:802 |
Tom数 (C语言代码)浏览:517 |
良心推荐——>题解1049:C语言程序设计教程(第三版)课后习题11.1 (C语言描述——简单明了,时间复杂度低)浏览:1318 |
C二级辅导-统计字符 (C语言代码)浏览:695 |
C语言程序设计教程(第三版)课后习题5.8 (C语言代码)浏览:692 |
C语言程序设计教程(第三版)课后习题5.4 (C语言代码)浏览:487 |
渴望学到知识的菜鸟 2022-01-11 11:26:17 |
循环条件 ,n = i ; n <= j ; n ++ 这里的前提是 i <= j ,不然一次循环都不会进行