最大的坑就在输入的两个变量的大小并没有规定前面大于后面。。。
1 #include <stdio.h>
2
3 //普通遍历
4 int Program(int n)
5 {
6 int num = 0;
7 while (1)
8 {
9 num++;
10 if (n == 1)
11 {
12 break;
13 }
14 else if (n % 2 != 0)
15 {
16 n = 3 * n + 1;
17 }
18 else
19 {
20 n /= 2;
21 }
22 }
23 return num;
24 }
25
26
27
28 int main(void)
29 {
30 int m, n;
31 while (scanf("%d%d", &m, &n) != EOF)
32 {
33 int x = m;
34 int y = n;
35 if (m > n)
36 {
37 int tmp = m;
38 m = n;
39 n = tmp;
40 }
41 int max = 0;
42 for (int i = m; i <= n; i++)
43 {
44 int res = Program(i);
45 if (res > max)
46 {
47 max = res;
48 }
49 }
50 printf("%d %d %d\n", x, y, max);
51 }
52 return 0;
53 }
下面进行一点时间上的优化,以空间换时间。。。
1 #include <stdio.h>
2
3 #define MAX 1000010
4 static int a[MAX] = {0};
5
6 //记忆化遍历 降低运行时间 MAX越大能够记录的数值越多,后台数据比较多的情况下运行速度相对也会越快
7 int ProgramPlus(int n)
8 {
9 int num = 0;
10 int tmp = n;
11 while (1)
12 {
13 //因为某些数可能会持续执行n * 3 + 1操作,会超出MAX界限导致失败
14 //所以进行n < MAX判断
15 if (n < MAX && a[n] != 0)
16 {
17 num += a[n];
18 break;
19 }
20 num++;
21 if (n % 2)
22 {
23 n = 3 * n + 1;
24 }
25 else
26 {
27 n /= 2;
28 }
29 }
30 a[tmp] = num;
31 return num;
32 }
33
34 int main(void)
35 {
36 a[1] = 1;
37 int m, n;
38 while (scanf("%d%d", &m, &n) != EOF)
39 {
40 int x = m;
41 int y = n;
42 if (m > n)
43 {
44 int tmp = m;
45 m = n;
46 n = tmp;
47 }
48 int max = 0;
49 for (int i = m; i <= n; i++)
50 {
51 int res = ProgramPlus(i);
52 if (res > max)
53 {
54 max = res;
55 }
56 }
57 printf("%d %d %d\n", x, y, max);
58 }
59 return 0;
60 }
转载于:https://www.cnblogs.com/changeFeng/p/9367795.html