对于每一个对输入整数i和j,输出为i、j和最大周期长度。这三个数用空格分开,三个数在同一行,每两个数之间有一个空格。
应该把已经计算过的数的周期长度保存下来,超时的原因是已经计算过的周期长度的重复计算,
思路:
先将一个数组全部赋值为-1.如果值为-1就用函数进行运算得到结果后赋值给它。这样下次这个数就不用再进行循环运算了。大大减少了运算时间。
注:如果题目中没有明确指出在运算过程中不会溢出。需要考虑n*3会不会溢出int型的范围。这个时候就要long long int 一个数 代替n进行运算
代码:
#include<stdio.h> #include<string.h> #include<math.h> int bi(int n)//定义函数 { int k = 0; while(n!=1) { if(n%2 == 0) { n = n/2; } else { n = n*3 + 1; } k += 1; } return k+1; } int s[1000100];//开数组 int main() { int i, j, max,t; memset(s, -1, sizeof(s));//全部赋值为-1 while(scanf("%d%d",&i,&j)!=EOF) { printf("%d %d",i,j);//先输出i,j if(i > j)//比较i j大小 { t = i; i = j; j = t; } max = bi(i); for(i=i+1;;i<=j;i++) { if(s[i] == -1)//如果数据还未被记录 进行运算 如果已经被记录在数组内 直接调用 { s[i] = bi(i); } if(s[i] > max)//每次比较大小 { max = s[i]; } } printf(" %d\n",max); } return 0; }