PAT--1001. 害死人不偿命的(3n+1)猜想 (15)

卡拉兹(Callatz)猜想:

对任何一个自然数n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把(3n+1)砍掉一半。这样一直反复砍下去,最后一定在某一步得到n=1

对给定的任一不超过1000的正整数n,简单地数一下,需要多少步(砍几下)才能得到n=1?

输入格式:每个测试输入包含1个测试用例,即给出自然数n的值。

输出格式:输出从n计算到1需要的步数。

输入样例:

3

输出样例:

5
 1 #include<stdio.h>
 2 int fun1(int n,int cout);
 3 int fun2(int n,int cout);
 4 int main()
 5 {
 6     int n,cout=0;
 7     scanf("%d",&n);
 8     cout=fun1(n,cout);
 9     printf("fun1:cout=%d\n",cout);
10     cout=fun2(n,0);
11     printf("fun2:cout=%d\n",cout);
12     return 0;
13  } 
14  //递归算法 
15  int fun1(int n,int cout)
16  {
17      if(n==1)
18          return cout;
19      else if(n%2==0)
20      {
21          cout++;
22          return fun1(n/2,cout);
23      }    
24      else
25      {
26          cout++;
27          return fun1((3*n+1)/2,cout);
28      }    
29  }
30  // 条件运算符(?:)<
31  int fun2(int n,int cout)
32  {
33      while(n!=1)
34      {
35          cout++;
36          n=n%2==1?(3*n+1)/2 : n/2;//表达式1>?<表达式2>:<表达式3> 1满足条件,执行2,反之执行3
37      }
38      return cout;
39  }

 

posted @ 2017-06-29 22:05  Stranger115  阅读(239)  评论(0)    收藏  举报