用1,2,3……,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3。按照“abc def ghi”的格式输出所有解,每行一个解。提示:不必太动脑筋。
分析:
- 最大的数ghi是987,对应的abc是329。最小的数是123。所以for循环只需要控制abc从123到329就好。
- 1-9相加是45,相乘是3628800。是否输出,只需判断和与积即可。
- 百位的数字用 / 100;计算。十位的数字用 / 10 % 10; 计算,个位的数字用 % 10;计算。
int main()
{
int abc, def, ghi, a, b, c, d, e, f, g, h, i;
int add, mul;
for(abc = 123; abc <=329; abc++)
{
def = abc * 2;
ghi = abc * 3;
add = 0;
mul = 1;
***a = abc / 100;
b = abc / 10 % 10;
c = abc % 10;
d = def / 100;
e = def / 10 % 10;
f = def % 10;
g = ghi / 100;
h = ghi / 10 % 10;
i = ghi % 10;***
add = a+b+c+d+e+f+g+h+i;
mul = a*b*c*d*e*f*g*h*i;
if(add == 45 && mul == 362880)
printf("%d %d %d\n", abc, def, ghi);
}
return 0;
}
发现代码复用,抽取成方法:
#include <stdio.h>
void split(int num, int &add, int &mul){
int i, j, k;
i = num / 100;
j = num / 10 % 10;
k = num % 10;
add += i + j + k;
mul *= i * j * k;
}
int main()
{
int abc, def, ghi, a, b, c, d, e, f, g, h, i;
int add, mul;
for(abc = 123; abc <=329; abc++)
{
def = abc * 2;
ghi = abc * 3;
add = 0;
mul = 1;
split(abc, add, mul);
split(def, add, mul);
split(ghi, add, mul);
if(add == 45 && mul == 362880)
printf("%d %d %d\n", abc, def, ghi);
}
return 0;
}