排列问题

最近在看刘汝佳的《算法竞赛入门经典》,上面有道习题很有意思,说用1到9组成三个三位数abc,def,ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3.

生成三个比为1:2:3的数很容易,只需用循环使abc从100循环到999,再使ghi,也就是abc*3小于1000便是,但是最大的问题是1到9每个数字使用一次。这里我想到一个解决方法。因为a+b+。。。+i固定等于45,而且a*b*。。。。。i固定等于362880.所以只需判断这两个条件满足便能判断1到9每个数只使用一次。但是这两个条件必须同时存在,少一个都会有多余的结果出现,代码如下:

#include<stdio.h>
void main()
{
	int count=0;

	for(int i=100;i<1000;i++)
	{
		int twice_i=i*2;
		int trible_i=i*3;
        int a1=i/100;
		int a2=(i%100)/10;
		int a3=i%100%10;
		int a4=twice_i/100;
		int a5=(twice_i%100)/10;
		int a6=twice_i%100%10;
		int a7=trible_i/100;
		int a8=(trible_i%100)/10;
		int a9=trible_i%100%10;
        int sum=a1+a2+a3+a4+a5+a6+a7+a8+a9;//记录总和
		float product=(float)a1*a2*a3*a4*a5*a6*a7*a8*a9;//记录总乘积
		if(trible_i<1000&&sum==45&&product==362880)
		{
			
			count++;
			printf("%d:%d:%d,第%d个\n",i,twice_i,trible_i,count);

		}
	}

}


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值