用1,2,3.~9组成3个三位数abc,def,ghi,每个数字恰好使用一次,要求abc:def:ghi = 1:2:3。按照"abc def ghi"的格式输出所有解,每行一个解。
解答:1.用bool Flag[10]数组来标记数字是否出现。
2.三个数中abc最小为 123,同时1000/3最大的组成为329,所以需要枚举123~329的所有数
3.因为三个数九个不同的数字,所以如果abc,def,ghi存在,那么1~9都会出现,则Flag[i]中的每个元素都是true ,Flag[i]不为true,那么有数字重复,所以不成立 。
以上方法转载自https://blog.youkuaiyun.com/lecholin/article/details/69787589,其中我有所添加。
#include<stdio.h>
int main(){
int abc,def,ghi;
for(int abc=123;abc<=329;++abc){
bool Flag[10] = {false}; //统计0~9是否出现
//标记abc中a,b,c
Flag[abc/100] = Flag[abc/10%10] = Flag[abc%10] = true;
def = 2 * abc;
//标记def中d,e,f
Flag[def/100] = Flag[def/10%10] = Flag[def%10] = true;
//标记ghi中g,h,i
ghi = 3 * abc;
Flag[ghi/100] = Flag[ghi/10%10] = Flag[ghi%10] = true;
bool flag = true;
//因为三个数九个不同的数字,所以如果abc,def,ghi存在,那么1~9都会出现,则Flag[i]中的每个元素都是true
for(int i = 1;i<=9;++i){
if(Flag[i] != true){ //有Flag[i]不为true,那么有数字重复,所以不成立
flag = false;
break;
}
}
if(flag){
printf("%d %d %d\n",abc,def,ghi);
}
}
return 0;
}