[解题报告] 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是限制值。其中, A或L,既不是大于 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 }