The 3n+1 problem
一道很经典的题,各大OJ上面都有,经典的递归设计。
1 #include <stdio.h>
2 #include <string.h>
3 #define SWP(x,y,t) ((t)=(x),(x)=(y),(y)=(t))
4 #define NL 10010
5
6 int cyl[NL];
7
8 int f(int k)
9 {
10 if (k == 1) return 1;
11 if (k<NL && cyl[k]) return cyl[k];
12 if (k&1) {
13 if (k<NL) return cyl[k] = f(3*k+1) + 1; //注意不要越界
14 else return f(3*k+1) + 1;
15 }else {
16 if (k<NL) return cyl[k] = f(k/2) + 1;
17 else return f(k/2) + 1;
18 }
19 }
20 //打表计算
21 void getCyl()
22 {
23 memset(cyl, 0, sizeof(cyl));
24 for (int i=1; i<NL; i++) {
25 if (cyl[i]) continue;
26 cyl[i] = f(i);
27 }
28 }
29
30 int main()
31 {
32 getCyl();
33 int a, b, t;
34 while (scanf("%d%d", &a, &b) != EOF) {
35 printf("%d %d ", a, b);
36 if (a > b) SWP(a,b,t);
37 int max = 0;
38 for (int i=a; i<=b; i++) {
39 if (cyl[i] > max) max = cyl[i];
40 }
41 printf("%d\n", max);
42 }
43 return 0;
44 }
45
46