1,2,3,...,9は3つの3桁abc,def,ghiを構成し,各数字はちょうど1回使用され,abc:def:ghi=1:2:3を要求する.すべての解を出力します.
1645 ワード
テーマ:1,2,3......,9で3つの3桁abc,def,ghiを構成し,各数字に1回適切に使用し,abc:def:ghi=1:2:3を要求する.すべての解を出力します.
最初は簡単で乱暴な方法でやっていましたが、問題をよく読んでみるとテクニックがあり、9つの数を合わせると45で、乗算は362880で、この2つの数は変わらないので、この2つの条件によって求めることができます.
もう1つの方法はabcdefghiを文字列で保存して比較し、1から9でabc,def,ghiを出力することです.
最初は簡単で乱暴な方法でやっていましたが、問題をよく読んでみるとテクニックがあり、9つの数を合わせると45で、乗算は362880で、この2つの数は変わらないので、この2つの条件によって求めることができます.
#include
#include
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
", i, j, k);
}
return 0;
}
もう1つの方法はabcdefghiを文字列で保存して比較し、1から9でabc,def,ghiを出力することです.
#include
#include
#include
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 * 2, n * 3);
}
}
return 0;
}