[解题报告] The Collatz Sequence

题目大意

题目原文:http://uva.onlinejudge.org/external/6/694.pdf

背景

编写一个程序

第 1 步:选择任意正整数A作为序列中的第一项。

第 2 步:如果A = 1 然后停止。

第 3 步:如果A为偶数,则替换A由A / 2,然后转到步骤 2。

第 4 步:如果A为奇数,然后替换A由 A * A + 1,并转到步骤 2。

这一问题的输入包含多个测试用例。每个案例中,输入包含两个正整数的单个行、 第一个是A 和第二个是L的初始值,L是限制值。其中, AL,既不是大于 2147483647 (可以存储在一个 32 位有符号整数的最大值)。初始的A值总是小于L,当A的值大于L的值时退出程序。当输入的值为负数时不进行计算。

 

 

Sample Input

3 100
34 100
75 250
27 2147483647
101 304
101 303
-1 -1

 

Sample Output
Case 1: A = 3, limit = 100, number of terms = 8
Case 2: A = 34, limit = 100, number of terms = 14
Case 3: A = 75, limit = 250, number of terms = 3
Case 4: A = 27, limit = 2147483647, number of terms = 112
Case 5: A = 101, limit = 304, number of terms = 26
Case 6: A = 101, limit = 303, number of terms = 1

算法:

关键是要比较输入输出样列,得到关系和看清题目的条件,要注意的是代码要求保留A的值。

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

 1 #include<stdio.h>
 2 int main(void)
 3 {
 4     long long a,l,b;
 5     int num,n=0;
 6 
 7     while(scanf("%lld %lld",&a,&l)!=EOF)
 8     {
 9         num=0;
10         b=a;
11         if(a < 0||l < 0)break;
12 
13         while(a!=1)
14         {
15             if(a%2==0)
16               {
17                   a=a/2;
18                   num++;
19               }
20             else
21               {
22                   a=3*a+1;
23                   num++;
24                   if(a > l)break;
25               }
26         }
27         if(a==1)num++;
28         n++;
29         printf("Case %d: A = %lld, limit = %lld, number of terms = %d\n",n,b,l,num);
30     }
31     return 0;
32 }

 

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