一、题目
用 1,2,3…,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3。按照“abc def ghi”的格式输出所有解,每行一个解。提示:不必太动脑筋。
二、解题思路
可以想到abc的范围应该是大于123小于333。用数组num[10]保存1-9这九个数字的使用情况,num[i]=0,表示没有使用,num[i]=1,表示使用了。
直接暴力求解搜索def=2abc,ghi=3abc,并改变相应位的数字对应的num数组的值,若最后num数组的num[1]-num[9]均为1,即1-9每个数字都出现过,则输出对应的abc,def,ghi;否则进行下一次循环。
三、代码
#include<stdio.h>
int main(){
int abc,def,ghi,num[10];//num数组用于记录相关数字是否出现过
for(abc=123;abc<333;abc++){ //根据要求缩小abc的取值范围
for(int i=0;i<10;i++){
num[i]=0; //每次初始化记录数组为全0
}
num[abc/100]=1;//记录abc百位上数字相关的数组值为1
num[abc/10%10]=1;//记录abc十位上数字相关的数组值为1
num[abc%10]=1;//记录abc个位上数字相关的数组值为1
def=abc*2; //求def,并同理将出现的数字用num数组做记录
num[def/100]=1;
num[def/10%10]=1;
num[def%10]=1;
ghi=abc*3;
num[ghi/100]=1;
num[ghi/10%10]=1;
num[ghi%10]=1;
int i;
for(i=1;i<10;i++){
if(num[i]!=1){
break;
}
}
if(i==10){
printf("abc: %d def: %d ghi: %d\n",abc,def,ghi);
}
}
return 0;
}