题目:用1,2,3……,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3.输出所有解。
开始我选择用简单又粗暴的方法做,再仔细读题后发现是有技巧的,九个数加起来是45,相乘是362880,这两个数是不变的,所以可以根据这两个条件来求
#include<iostream>
#include<cstdio>
using namespace std;
void result(int num, int &result_add, int &result_mul)
{
int i, j, k;
i = num / 100; //百位
j = num / 10 % 10; //十位
k = num % 10; //个位
result_add += i + j + k; //分解出来的位数相加
result_mul *= i * j * k; //相乘
}
int main()
{
int i, j, k;
int result_add, result_mul;
for(i = 123; i <=329; i++)
{
j = i * 2;
k = i * 3;
result_add = 0;
result_mul = 1;
result(i, result_add, result_mul);
result(j, result_add, result_mul);
result(k, result_add, result_mul);
if(result_add == 45 && result_mul == 362880)
printf("%d %d %d\n", i, j, k);
}
return 0;
}
还有一种做法,将abcdefghi用字符串存起来,再进行比较,存在1到9就输出abc,def,ghi
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int main(int argc, const char * argv[])
{
int n, i, j;
char a[10];//数组定义比实际大一些
for(n = 123; n < 330; n++)
{
sprintf(a, "%d", n * 1000000 + n * 2 * 1000 + n * 3);//将abcdefghi存入到字符串a中
for(j = 0, i = '1'; i <= '9'; memchr(a, i++, 9) && j++);//比较1到9,用j记录
if (j == 9)
{
printf("%d %d %d \n", n, n * 2, n * 3);
}
}
return 0;
}