『今週の問題』第205回 解答


◆東京都 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解です。)

  1.  (1 9 8)(2 7) = (5 3 4 6)
  2.  (1 3 8)(4 2) = (5 7 9 6)
  3.  (1 5 9)(4 8) = (7 6 3 2)
  4.  (1 5 7)(2 8) = (4 3 9 6)
  5.  (1 8 6)(3 9) = (7 2 5 4)
  6.  (2 9 7)(1 8) = (5 3 4 6)
  7.  (4 8 3)(1 2) = (5 7 9 6)


 ◆ 問題へもどる

 ◆ 今週の問題

数学の部屋へもどる