The 3n + 1 problem UVA - 100

  3n+1问题

PC/UVa IDs: 110101/100

Popularity: A

Success rate: low Level: 1

测试地址:

https://vjudge.net/problem/UVA-100

[问题描述]

考虑如下的序列生成算法:从整数 n 开始,如果 n 是偶数,把它除以 2;如果 n 是奇数,把它乘 3 加1。用新得到的值重复上述步骤,直到 n = 1 时停止。例如,n = 22 时该算法生成的序列是:

22,11,34,17,52,26,13,40,20,10,5,16,8,4,2,1

人们猜想(没有得到证明)对于任意整数 n,该算法总能终止于 n = 1。这个猜想对于至少 1 000 000内的整数都是正确的。

对于给定的 n,该序列的元素(包括 1)个数被称为 n 的循环节长度。在上述例子中,22 的循环节长度为 16。输入两个数 i 和 j,你的任务是计算 i 到 j(包含 i 和 j)之间的整数中,循环节长度的最大值。

[输入]

输入每行包含两个整数 i 和 j。所有整数大于 0,小于 1 000 000。

[输出]

对于每对整数 i 和 j,按原来的顺序输出 i 和 j,然后输出二者之间的整数中的最大循环节长度。这三个整数应该用单个空格隔开,且在同一行输出。对于读入的每一组数据,在输出中应位于单独的一行。

[样例输入]

1 10

100 200

201 210

900 1000

[样例输出]

1 10 20

100 200 125

201 210 89

900 1000 174

 1 #include<iostream>
 2  using namespace std;
 3  
 4   int main()
 5 {
 6 int  k,j;
 7 while(cin>>k>>j)
 8 {    int tem;
 9     int e=0;
10 if(k>j)//判断kj大小,如果发生调换,e=1 
11     {tem=j;
12     j=k;
13     k=tem;
14     e=1; 
15     }
16 int t=0,max=0;
17     for(int  i=k;i<=j;i++)
18     {
19         int n=i;
20     while(1)
21     {
22         if(n==1)
23         {t++;break;
24         }
25         if(n&1==1)//qi
26         {n=3*n+1;
27         }
28         else n/=2;
29         t++;
30     
31     }
32 
33     if(t>max)
34     {max=t;
35     }
36     t=0;
37     }
38 if(e==1)//发生调换后,输出是调换前的值 
39 cout<<j<<" "<<k<<" "<<max<<endl;
40 else 
41 cout<<k<<" "<<j<<" "<<max<<endl;    
42     
43 }
44 return 0; 
45 }

测试没问题,但是提交后出错;看了别人的博客后发现问题所在,题目没有规定输入两个数一定i<j;即可以输入10  1;

猜你喜欢

转载自www.cnblogs.com/niliuxiaocheng/p/10548019.html