UVa_OJ 694 Collatz序列
2016-03-10 23:09
393 查看
这道题的大意是这样的:
给定一个初始的正整数A,一个用来作判断溢出限制的正整数L,A和L都不会超过2,147,483,647,并且A小于L。然后按照如下规则进行序列生成:
1,当A=1时,序列生成停止;
2,当A为偶数时,A=A/2;然后去规则1(即,检查A是否为1,若为1,停止;否则,继续);
2,当A为奇数时,A=A*3+1;然后去规则1;
其中需要注意两点:
1,当A*3+1>L时,程序需停止,此时不需要用A*3+1去替换A;
2,题目所需要统计的序列里有多少个数时,还包括”起始“的数A;
3,不能直接用int类型,否则会溢出,建议使用long long。
个人解题思路参考:
此题在计算序列里有多少个数时,要注意检查A是否大于L,只有当A<=L时,该数才能作为生成的数,计入序列的总数中,(尤其是经过A=A*3+1运算得到的A)。
下面是自己的代码,AC通过:
给定一个初始的正整数A,一个用来作判断溢出限制的正整数L,A和L都不会超过2,147,483,647,并且A小于L。然后按照如下规则进行序列生成:
1,当A=1时,序列生成停止;
2,当A为偶数时,A=A/2;然后去规则1(即,检查A是否为1,若为1,停止;否则,继续);
2,当A为奇数时,A=A*3+1;然后去规则1;
其中需要注意两点:
1,当A*3+1>L时,程序需停止,此时不需要用A*3+1去替换A;
2,题目所需要统计的序列里有多少个数时,还包括”起始“的数A;
3,不能直接用int类型,否则会溢出,建议使用long long。
个人解题思路参考:
此题在计算序列里有多少个数时,要注意检查A是否大于L,只有当A<=L时,该数才能作为生成的数,计入序列的总数中,(尤其是经过A=A*3+1运算得到的A)。
下面是自己的代码,AC通过:
#include<stdio.h> int main() { #ifdef LOCAL freopen("694_input.txt","r",stdin); freopen("694_output.txt","w",stdout); #endif int caseNum=0; long long A,L,count; while(scanf("%lld %lld",&A,&L)==2&&(A>0&&L>0)) { caseNum++; count=1; printf("Case %d: A = %lld, limit = %lld, ",caseNum,A,L); while(A!=1) { if(A%2==0)A/=2; else A=A*3+1; if(A<=L)count++; else break; } printf("number of terms = %lld\n",count); } return 0; }
相关文章推荐
- 1.10055 - Hashmat the brave warrior
- 2.10071 - Back to High School Physics
- 3.458 - The Decoder
- 4.694 - The Collatz Sequence
- 6.494 - Kindergarten Counting Game
- 7.490 - Rotating Sentences
- 8.414 - Machined Surfaces
- 9.488 - Triangle Wave
- A.457 - Linear Cellular Automata
- B.489 - Hangman Judge
- C.445 - Marvelous Mazes
- 1.10494 - If We Were a Child Again
- 2.424 - Integer Inquiry
- 3.10250 - The Other Two Trees
- 5.465 - Overflow
- 6.113 - Power of Cryptography
- 7.10161 - Ant on a Chessboard
- 8.621 - Secret Research
- 9.401 - Palindromes
- A.537 - Artificial Intelligence?