用1,2,3,...,9组成3个三位数abc, def和ghi,每个数字恰好使用一次,要求abc:def:ghi = 1:2:3。按照"abc def ghi"的格式输出所有解,每行一个解。提示:不必太动脑筋。
原理是遍历所有数字再进行筛选,优点是简单容易实现,缺点是程序计算的时间较长。
#include <stdio.h>
#define A 100
#define B 999
//题目:输出[1,9]其中三位组成的三位数,abc,def,ghi,每个数字恰好使用一次,并且要求abc:def:ghi=1:2:3。
int main(void)
{
int i,j,k,n,m,boo_l=1; //数1,数2,数3,用于循环赋值,用于循环赋值
//boo_l用来假定每一个数都是满足条件的,在往后的判断中,不符合条件的数只要改变的boo_l的值就很容易让程序知道这个数符不符合条件
int count[10][2]; //用于计算[0,9]出现的次数
for(i=A;i<=B;i++) //有三个数字,所有三个循环
for(j=A;j<=B;j++)
for(k=A;k<=B;k++){
for(n=0;n<=9;n++){ //初始化计数器,用来筛选带有重复数字的数
count[n][1]=n; //比较对象
count[n][2]=0; //计数器
}
if(2*i == j && 3*j==2*k && 3*i == k){ //判断条件1
for(m=0;m<=9;m++){ //用于统计i中[0,9]出现的次数
if(i/100==count[m][1])
count[m][2]++;
if(j/100==count[m][1])
count[m][2]++;
if(k/100==count[m][1])
count[m][2]++;
}
for(m=0;m<=9;m++){ //同上
if(i/10%10==count[m][1])
count[m][2]++;
if(j/10%10==count[m][1])
count[m][2]++;
if(k/10%10==count[m][1])
count[m][2]++;
}
for(m=0;m<=9;m++){ //同上
if(i%100%10==count[m][1])
count[m][2]++;
if(j%100%10==count[m][1])
count[m][2]++;
if(k%100%10==count[m][1])
count[m][2]++;
}
for(m=0;m<=9;m++){ //判断并排除带有重复数字的数
if(count[m][2]>1){
boo_l=0;
break;
}
}
if(boo_l){ //输出满足条件的数字
printf("boo_l=%d %d %d %d\n",boo_l,i,j,k);
}
boo_l=1; //重置boo_l的数值
}
}
return 0;
}
反思:过程中用了数组,按照正常的章节进度,这个问题可以不使用数组解决,在输出符合条件的数字上浪费了过多的调试时间,没有很好的理解嵌套循环的原理已经其中语句的执行方式。