[解题报告]The 3n + 1 problem
题目大意
题目原文:http--uva.onlinejudge.org-external-1-100.pdf
背景
在计算机科学中的问题往往被列为属于某一类问题,例如 NP、 不可解的递归。在这一类问题会分析一种算法,其分类是输入不已知的所有可能的属性。
问题
请考虑下面的算法:
1. input n
2. print n
3. if n = 1 then STOP
4. if n is odd then
5. else
6. GOTO 2
鉴于 22 输入,下面的数字序列将打印的 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
当打印 1时上述算法将终止。算法很简单,尽管这一猜想是否真实。然而,对于所有整数n这种那个 0 < n < 1,000,000 (这比很多更多数字)它已经过验证。
在上面的示例中,22 的周期长度是 16。
对于任何两个数字i和j,你要确定在i和j之间的最大周期长度。
输入
输入将包括一系列的对整数我和j,一个对每行的整数。所有的整数将不少于 1,000,000 和大于 0。
您可以假定没有操作溢出一个 32 位整数。
输出
应输出i和j,按输入的顺序,和介于i和j之间(包括i和j)所有数的最大周期长度
Sample Input:
1 10 100 200 201 210 900 1000
Sample Output:
1 10 20 100 200 125 201 210 89 900 1000 174
算法:
我们要考虑的是当i的值大于j的值时候要将这俩个值进行交换,其次要注意包括自己本身,所以计数的时候不该把自己本身所漏掉。
还要注意就是代码的简练。
代码:这里附上我的代码,你可以去这里提交你的代码验证你的代码是否正确,
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<stdio.h> 2 int main(void) 3 { 4 int num1=0,flag=1; 5 int i,j,a,b,n,num2,temp; 6 7 while(EOF!=scanf("%d %d",&i,&j)) 8 { 9 a=i; 10 b=j; 11 num2=1; 12 if(i>j) 13 { 14 temp=i; 15 i=j; 16 j=temp; 17 } 18 19 for(;i <= j;i++) 20 { 21 n=i; 22 while(flag) 23 { 24 25 if(n==1) 26 { 27 num1++; 28 flag=0; 29 } 30 else if(n%2==0) 31 { 32 n=n/2; 33 num1++; 34 } 35 else 36 { 37 n=n*3+1; 38 num1++; 39 } 40 41 } 42 if(num1 >num2) 43 num2=num1; 44 num1=0; 45 flag=1; 46 47 } 48 printf("%d %d %d\n",a,b,num2); 49 50 } 51 return 0; 52 }