您的位置:首页 > 其它

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通过:

#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  UVa_OJ uva 694 Collatz序列