HDU The 3n + 1 problem(简单题 有坑)

Posted changefeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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
", 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
", x, y, max);
58     }
59     return 0;
60 }

 

以上是关于HDU The 3n + 1 problem(简单题 有坑)的主要内容,如果未能解决你的问题,请参考以下文章

HDU 1032 The 3n + 1 problem

(HDU/UVA)1032/100--The 3n + 1 problem(3n+1问题)

HDU 1032 [The 3n + 1 problem] 暴力模拟

HDU 1032.The 3n + 1 problem注意细节预计数据不强8月21

hdu 1032 The 3n + 1 problem

题解报告:hdu 1032 The 3n + 1 problem