UVa_OJ 694 Collatz序列

本文介绍了一种根据特定规则生成数列并统计序列中有效数值数量的算法。该算法考虑了溢出限制条件,使用longlong类型变量避免整数溢出。文中提供了一个AC通过的C语言实现代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这道题的大意是这样的:

给定一个初始的正整数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;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值