最近在看刘汝佳的《算法竞赛入门经典》,上面有道习题很有意思,说用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);
}
}
}