PAT甲级1-害死人不偿命的(3n+1)猜想(c++)

#include<iostream>
int main()
{
	int n,i=0;
	std::cout << "Enter  number:" << std::endl;//这一项多余,放在pta中反而不通过 
	std::cin >> n;
	while(n!=1)
	{
		if(n%2==0)
		{
			n=n-n/2;
			i++;
		}
		else
		{
			n=(3*n+1)-(3*n+1)/2;
			i++;
		}
	}
	std::cout << i;
}

心得:
①这道题第一遍做的时候将n=(3n+1)-(3n+1)/2不小心写成了n=(3n-1)-(3n-1)/2导致怎么测试都得不到正确答案。由于当时是在下午写得不得不说人一到下午精力是真的差啊,这种小错误都会犯。隔天晚上一调试就发现了问题的所在,断点真是个好东西!!

优化版

#include<iostream>
int main()
{
	int n,i=0;
	std::cout << "Enter  number:" << std::endl;//这一项多余,放在pta中反而不通过 
	std::cin >> n;
	while(n!=1)
	{
		if(n%2==0)
		{
			n=n-n/2;
		}
		else
		{
			n=(3*n+1)/2;//原式是n=(3*n+1)-(3*n+1)/2;其实可以直接化解,虽然理解起来没有前面那么直观 
		}
		i++;//之前是在两条分支语句中都使用了i++,干脆直接“提公因式”将这条语句放到两条分支之外 
	}
	std::cout << i;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值