简洁精美源于分析透彻,构思明确、求精,逻辑练达。(15)

探讨了如何找出五个互不相同的正整数,这些数的总和为23,并且能够通过它们的不同组合表示从1到23的所有自然数。通过逻辑推理确定了数列的初步构成。
	/*已知5个互不相同的正整数之和为23,且从这5个数中挑选若干个加起来可以表示从1到23之内的全部自然数
	从审题可推出5个数中必定有个数为1,2这个数不能由2个相同的1相加,因此必有个数是2,则剩下只有3个数待定 自然数推断(1, 2, 4, 7, 9);*/
	int 数1 = 1, 数2 = 2, 数3 = 数2 + 1, 数4 = 数3 + 1, 数5 = 数4 + 1;
	do
	{
		if (数1 + 数2 + 数3 + 数4 + 数5 >= 23)
		{
			if (数1 + 数2 + 数3 + 数4 + 数5 == 23)
				if (自然数推断(数1, 数2, 数3, 数4, 数5))
					printf("%d,%d,%d,%d,%d\n", 数1, 数2, 数3, 数4, 数5);
			if (数4 + 数5 >= 23)
				数4 = ++数3;
			数5 = ++数4 + 1;
		}
		else ++数5;
	} while (数3 + 数4 < 23);

组合借鉴思路即0和1当作开关用,确是巧思.

bool 自然数推断(int 数1, int 数2, int 数3, int 数4, int 数5)
{
	bool 推 = false;
	int 自然数 = 3, 组1 = 0, 组2 = 0, 组3 = 0, 组4 = 0, 组5 = 0;/*从3始至22穷举五个数所有组合,检查是否满足条件*/
	do
	{
		推 = false; 组1 = 0;
		while (组1 <= 1 && !推)
		{
			组2 = 0;
			while (组2 <= 1 && !推)
			{
				组3 = 0;
				while (组3 <= 1 && !推)
				{
					组4 = 0;
					while (组4 <= 1 && !推)
					{
						组5 = 0;
						while (组5 <= 1 && !推)
						{
							if (数1*组1 + 数2*组2 + 数3*组3 + 数4*组4 + 数5*组5 == 自然数) 推 = true;
							++组5;
						}
						++组4;
					}
					++组3;
				}
				++组2;
			}
			++组1;
		}
		if (!推) break;
	} while (++自然数 < 23);
	return 推;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值