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/UVA)1032/100--The 3n + 1 problem(3n+1问题)
HDU 1032 [The 3n + 1 problem] 暴力模拟