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

 

 

你可能感兴趣的:(em)