天天看點

HDU The 3n + 1 problem(簡單題 有坑)

最大的坑就在輸入的兩個變量的大小并沒有規定前面大于後面。。。

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