◆東京都 oidon さんからの解答
【問題1】
5 6 / 8= 4 9 / 7= 2 1 / 3
8 1 / 9= 5 4 / 6= 2 7 / 3
2 answers
【問題2】
5 4 x 3= 2 7 x 6= 1 8 x 9
1 answers
【問題3】
138 x 42 = 5796
157 x 28 = 4396
159 x 48 = 7632
186 x 39 = 7254
198 x 27 = 5346
297 x 18 = 5346
483 x 12 = 5796
7answers
以下のプログラムによって0.7secでした。
#include <iostream> using namespace std; int func_div( const int* v ) { int m = v[ 0 ] * 10 + v[ 1 ]; int c = v[ 2 ]; if ( m % c != 0 ) return -1; return m / c; } int func_mul( const int* v ) { return ( v[ 0 ] * 10 + v[ 1 ] ) * v[ 2 ]; } void output_numbers( const int* numbers ) { cout << numbers[ 0 ] << " " << numbers[ 1 ] << " " << numbers[ 2 ] << endl; cout << numbers[ 3 ] << " " << numbers[ 4 ] << " " << numbers[ 5 ] << endl; cout << numbers[ 6 ] << " " << numbers[ 7 ] << " " << numbers[ 8 ] << endl; cout << endl; } int search( int* numbers, int pos, int value, int (*func)( const int* ) ) { int answers = 0; int next = pos + 1; for ( int i = 1; i <= 9; i++ ) { for ( int j = 0; j < pos; j++ ) { if ( numbers[ j ] == i ) { goto label__continue; } } if ( pos == 3 ) { if ( numbers[ 0 ] < i ) continue; } if ( pos == 6 ) { if ( numbers[ 3 ] < i ) continue; } numbers[ pos ] = i; if ( pos == 2 ) { value = (*func)( numbers ); if ( value < 0 ) continue; } else if ( pos == 5 ) { if ( (*func)( numbers + 3 ) != value ) { continue; } } else if ( pos == 8 ) { if ( (*func)( numbers + 6 ) != value ) { continue; } else { answers ++; output_numbers( numbers ); } } answers += search( numbers, next, value, func ); label__continue: continue; } return answers; } int scan( int* numbers, int pos ) { if ( pos == 9 ) { int a = numbers[ 0 ] * 100 + numbers[ 1 ] * 10 + numbers[ 2 ]; int b = numbers[ 3 ] * 10 + numbers[ 4 ]; int c = numbers[ 5 ] * 1000 + numbers[ 6 ] * 100 + numbers[ 7 ] * 10 + numbers[ 8 ]; if ( a * b == c ) { cout << a << " x " << b << " = " << c << endl; return 1; } return 0; } int next = pos + 1; int answers = 0; for ( int i = 1; i <= 9; i++ ) { for ( int j = 0; j < pos; j++ ) { if ( numbers[ j ] == i ) { goto label__continue; } } numbers[ pos ] = i; answers += scan( numbers, next ); label__continue: continue; } return answers; } int main( int argc, char** argv ) { int* numbers = new int[ 9 ]; cout << "Division" << endl; cout << search( numbers, 0, 0, func_div ) << " answers" << endl; cout << "Multiple" << endl; cout << search( numbers, 0, 0, func_mul ) << " answers" << endl; cout << "Multiple2" << endl; cout << scan( numbers, 0 ) << "answers" << endl; delete[] numbers; return 0; }
◆滋賀県 松尾 雅也 さんからの解答
【問題1】
割り算の答を以下の場合に分けて見てみます。
答が2になるのは、割る数 1から9までについて見ると
2÷1, 4÷2, 6÷3, 8÷4, 10÷5, 12÷6, 14÷7, 16÷8, 18÷9
の場合です。
この中から3組の同じ数を含まない組み合わせを捜します。
(この場合、2÷1, 4÷2, 6÷3, 8÷4 は割られる数が一桁なので×)
この組み合わせでは見つかりません。
同じように、答が3になるのは
3÷1, 6÷2, 9÷3, 12÷4, 15÷5, 18÷6, 21÷7, 24÷8, 27÷9
この組み合わせでは見つかりません。
答が4になるのは
4÷1, 8÷2, 12÷3, 16÷4, 20÷5, 24÷6, 28÷7, 32÷8, 36÷9
この組み合わせでは見つかりません。
答が5、6でも見つかりません。
答が7の場合、
7÷1, 14÷2, 21÷3, 28÷4, 35÷5, 42÷6, 49÷7, 56÷8, 63÷9
この場合、21÷3, 49÷7, 56÷8 が見つかりました。
答が8では見つかりません。
答が9の場合、
9÷1, 18÷2, 27÷3, 36÷4, 45÷5, 54÷6, 63÷7, 72÷8, 81÷9
この場合、27÷3, 54÷6, 81÷9 が見つかりました。
同様に進めていき答が34を越えると、割られる数が2桁なのは 1、2のみとなり、これ以降には見つかりません。
(略しましたが、10以降にも見つかりませんでした。)
結局、問題の等式が成り立つのは
21÷3, 49÷7, 56÷8 と 27÷3, 54÷6, 81÷9 の場合です。
【問題2】
かけ算の答の1の位が0から9になる場合ごとに見つけます。
B×C E×F H×Iの答の1の位が 1 になるのは、3×7 のみなので見つかりません。
2になるのは、1×2、2×6、3×4、4×8、6×7、8×9 の6通りです。
まず 1×2、3×4、6×7 の組み合わせを考えます。
この組み合わせで使われてない数は 5、8、9 です。
1×2について5を考えると、51×2 と 1×52 の組み合わせがあり、それぞれの答は 102 と 52 です。
8を考えると 162 と 82 になります。
以下、同様に各組み合わせについてかけ算の答を出します。
5 8 9 1×2 = 102 52 162 82 182 92 3×4 = 204 162 332 252 372 282 6×7 = 392 342 602 522 672 582となり、答が同じ組み合わせは見つかりません。
同じように、
1×2、3×4、8×9 1×2、4×8、6×7 2×6、3×4、8×9
では見つかりません。
3×4、6×7、8×9 の時、
1 2 5 3×4 = 52 42 92 72 212 162 6×7 = 112 102 182 162 392 342 8×9 = 162 152 252 232 522 472となり、答が162のとき、 54×3、27×6、18×9 で等式が成立ちます。
同じように、かけ算の1の桁が 3、4、5、6、7、8、9、となる場合について見てみます。
略しますが、等式が成り立つような組み合わせはありませんでした。
結局、問題の等式が成り立つのは
54×3、27×6、18×9 の場合だけです。
【問題3】
1 5 7 × 2 8 = 4 3 9 6
1 5 9 × 4 8 = 7 6 3 2
◆愛知県 Y.M.Ojisan さんからの解答
【問題1】
次の3種
(1) 57/6=19/2=38/4
(2) 56/8=49/7=21/3
(3) 54/6=81/9=27/3
【問題2】
次の1種
(1) 54*3=18*9=27*6
【問題1と2の考え方】
(a)5の位置を考える。
すると5の倍数の1の位は0を除くと5しかない。
5は1個しかないので、従って5の位置は10の位である。
対称性からA=5として良い。
(b)(a)および数字の重複がないことから、AB,DE,GHの候補は11および5の倍数ではない2桁の数である。
そして、C,F,Iが一桁の数値であるので、それらの比は一桁の整数比である。
(c)(b)よりAB,DE,GHのいずれかが10以上の素因数pを持てば、AB,DE,GHは全てpの倍数である。
AB≠DE≠GHであるのでpが34以上のものは候補から除外される。
一方、p=13、17、19、23、29、31の倍数のグループで50台を含み3種以上数字が重複しないものを探すと下記6グループがある。
[ ]は可能な整数比である。
(52,78,13)=[4:6:1] ,
(52,78,39)=[4:6:3] ,
(52,78,91)=[4:6:7],
(51,34,68)=[3:2:4]=[6:4:8],
(57,19,38)=[3:1:2]=[6:2:4]=[9:3:6],
(58,29,87)=[2:1:3]=[4:2:6]=[6:3:9]
比の数字との重複の無いものは(57,19,38)=[6:2:4] のみであり問題1の解が1個得られるのみである。
即ち 57/6=19/2=38/4 である。
(d) つぎにAB,DE,GHとして残された、p≦7(=2、3、7)の数を考える。
リストアップするとこれらは全部で22個あり、そのうち50台のものは54と56である。
さらにそれぞれとの比が1桁の整数のものを検討すると下記が得られる。
【AB=54】
(*,12)=[9:2] ,
(*,18)=[3:1]=[6:2]=[9:3] ,
(*.27)=[2:1]=[4:2]=[6,3]=[8:4] ,
(*,36)=[3:2]=[6:4]=[9:6] ,
(*,63)=[6:7] ,
(*,72)=[3:4]=[6:8] ,
(*,81)=[2:3]=[4:6]=[6:9]
比の数字との重複の無いものは下線の7種のみであり、
AB=54としてDE,GHの候補は18、27、72、81である。
この候補は特殊であり、D、E、G、Hは1、2、7、8の組み合わせであることが決定する。
即ち C、F、Iは3、6、9の組み合わせである。
よって比が[6:8]の72は落選である。
よってDE=27としてよい。
以上より、
問題1の解として 54/6=27/3=81/9、
問題2の解として 54*3=27*6=18*9
が得られる。
【AB=56】
比で重複しているものも除いて下記6種である。
(*,14)=[8:2] ,
(*,21)=[8:3] ,
(*.24)=[7:3],
(*.32)=[7:4] ,
(*.42)=[8:6] ,
(*.49)=[8:7]
比を含めて数字9が出るのは49からだけである。
49に付随する比の中に7があり、32と24は比に7があるので落選である。
さらに4も49の中で使用済みであるので、14と42も落選である。
よって AB=56のとき DE=49 GH=21だけに可能性がある。
実際、問題1の解として 56/8=49/7=21/3だけが存在する。
【問題3】
次の7種が得られた。(PC解です。)
◆ 問題へもどる
◆ 今週の問題へ