わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

九九2桁

 いきなりですが問題です.

 0から9までの数字を1つずつ使い,2桁の整数を5つ作ります.
 その5つの数がいずれも,九九の答えに現れるような,数の組み合わせと,九九の式をすべて答えなさい.

 例えば,3と5を選んで3×5=15,とするのではありません.3と5を選んで,35としたら,これは(5×7または7×5の積ですので)九九の表にあります.残りの「0, 1, 2, 4, 6, 7, 8, 9」から2つを選んで,九九の答えに現れる2桁の数を作り…と進めていきます.
 さっそくですが答えの一つです.

  • 6×5=30
  • 7×7=49
  • 8×7=56
  • 9×8=72
  • 9×9=81

 30,49,56,72,81を1桁ずつに分けて並び替えると,0,1,2,3,4,5,6,7,8,9となります.
 元ネタは以下の本のpp.16-28です.「この題材はかつて私がNHKの算数番組でも紹介したものである。」と書かれていました.

田中博史の算数授業実況中継

田中博史の算数授業実況中継

 もう少し,ルールを定めます.「2桁の整数」について,「02」のように十の位に0が来るものは,認めないことにします.「数の組み合わせ」は,順序が異なっても同じであれば同一解とし(30,49,56,81,72は上記と同一とみなします),九九の式については,2つの因数が逆なら異なる式(上記で5×6=30に替えたら異なる解)とします.
 では解き方を考えていきます.「0から9までの数字を1つずつ使い,2桁の整数を5つ作ります.」というのは,プログラマの観点では,0から9までの配列を並べ替えたのち,最初の2つの要素で(配列をaとすると,a[0] * 10 + a[1]で)2桁の整数,次の2つの要素でまた2桁の整数,…,とするのが思い浮かびます.「並び替え」には,RubyのArray#permutationメソッドを使用すれば,すべての並びを得ることができます.
 ただしこの場合,「すべての並び」に[3, 0, 4, 9, 5, 6, 7, 2, 8, 1]と[3, 0, 4, 9, 5, 6, 8, 1, 7, 2]が入っています.重複チェックは別途行う必要があります.
 与えられた整数nについて,九九の答えに現れるかどうかの判定と,九九の範囲のかけ算の式の文字列生成(例えばn=24なら「3 * 8 = 24」「4 * 6 = 24」「6 * 4 = 24」「8 * 3 = 24」の4つ)は,それぞれメソッドを定義します.
 入出力にも注意しながら,完成したRubyスクリプトにはkukuniketa.rbという名前をつけました.Gistに置いています.
 解の最後の2つと,いくつの解が得られたかを,実行結果より抜き出します.自分のデスクトップPCで,実行時間は12秒ほどかかっています.

$ ruby kukuniketa.rb
(略)
6 * 5 = 30
7 * 7 = 49
8 * 7 = 56
8 * 9 = 72
9 * 9 = 81

6 * 5 = 30
7 * 7 = 49
8 * 7 = 56
9 * 8 = 72
9 * 9 = 81

80 answers.
Numbers (4 patterns): [18, 27, 30, 49, 56] [18, 30, 49, 56, 72] [27, 30, 49, 56, 81] [30, 49, 56, 72, 81]

 解の最後の2つについて,2桁の整数5つはともに[30, 49, 56, 72, 81]ですが,かけ算の式について「8 * 9 = 72」,「9 * 8 = 72」という違いがあるため,異なるものとみなして出力しています.「80 answers.」というのは,この数え方での解の数となります.
 最後の「Numbers」は,解があった,2桁の整数5つの組み合わせとなります.10個の数の順列は3628800パターンあるのですが,そのうち4パターンだけです.2桁の数として見ると,いずれにも「30」「49」「56」が出現します.残りは,「18」か「81」か*1,「27」か「72」かです.
 ここまで,組み合わせが減った理由は,『田中博史の算数授業実況中継』で先生と子どもたちの掛け合いを通じて,読み取ることもできますが,かわりに九九の表を見直しましょう.Googleで検索して画像を見つけるのでもかまいませんし,https://www.shinko-keirin.co.jp/keirinkan/digital/keirin-web.htmlの下方の九九の表をクリックして移動する,http://www.shinko-keirin.co.jp/keirinkan/digital/ic/em/paint/2bs057_1_s.xhtmlのページでは,九九の表に現れる数に対し,塗りつぶしをすることができます.
 九九に現れる1桁の数を除外し,2桁の数をよく見ると,「9」が出現するのは,「7×7=49」だけとなるのがわかります.
 同様に,「7」が出現するのは,「27」と「72」だけ(かけ算の式は省略)です.
 そのようにして絞り込んでおくと,数の順列は,3百万よりもずっと少ないパターンとなります.kukuniketa.rbでは,4と9を取り除いた[0, 1, 2, 3, 5, 6, 7, 8]でも,答えを求めることができるようになっており,「80 answers.」「Numbers (4 patterns)」は変わりませんが,瞬時に実行を終えています.
 問題を変えてみます.

 1から6までの数を1つずつ使い,2桁の整数を3つ作ります.
 その3つの数がいずれも,九九の答えに現れるような,数の組み合わせと,九九の式をすべて答えなさい.

 この場合には,7も9も出現しないので,総当たりで([1, 2, 3, 4, 5, 6]を入力に与えて)求めさせます.
 最後の解は「7 * 3 = 21」「9 * 6 = 54」「9 * 7 = 63」です.「274 answers.」そして「Numbers (22 patterns)」を出力し,2桁の整数3つの組み合わせは,[12, 35, 64] [12, 36, 45] [12, 36, 54] [12, 45, 63] [12, 54, 63] [14, 25, 36] [14, 25, 63] [14, 32, 56] [15, 24, 36] [15, 24, 63] [15, 32, 64] [15, 36, 42] [15, 42, 63] [16, 24, 35] [16, 32, 45] [16, 32, 54] [16, 35, 42] [21, 35, 64] [21, 36, 45] [21, 36, 54] [21, 45, 63] [21, 54, 63]となっています.

(最終更新:2019-03-11 晩)

*1:18に対して,九九の式は2×9=18,3×6=18,6×3=18,9×2=18の4通りがある一方,81に対しては9×9=81の1つだけです.49も1通りで,それ以外は2通りです.解(九九の式の組み合わせ)は,[18, 27, 30, 49, 56]と[18, 27, 30, 49, 56]は32通りずつ,[27, 30, 49, 56, 81]と[30, 49, 56, 72, 81]と8通りずつで,合計80通りとなります.