最大的坑就在輸入的兩個變量的大小并沒有規定前面大于後面。。。
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