[解题报告]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 tex2html_wrap_inline44

5. else tex2html_wrap_inline46

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。

对于任何两个数字ij,你要确定在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的值时候要将这俩个值进行交换,其次要注意包括自己本身,所以计数的时候不该把自己本身所漏掉。

还要注意就是代码的简练。

代码:这里附上我的代码,你可以去这里提交你的代码验证你的代码是否正确,

View Code
 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 }

 

posted @ 2013-02-02 22:58  乱七八糟 。  阅读(273)  评论(0编辑  收藏  举报