注)コメントをもとに問題文を修正しました(ありがとうございます!)。また、図を追加しました。
2024年に出るかもしれない数学の問題で気に入ったやつをRubyでやる。
2024を2個以上の連続した正の整数の和で表しなさい。(ただしRubyは使ってよいこととする。)
大人になると問題を解くのにRubyを使ってもよいのだ。
n = eval(ARGV.shift || "2024")
(1...n).each do |first|
(first..n).each do |last|
sequence = first..last
if sequence.sum == n
puts "#{n} == (#{sequence}).sum, <#{sequence.size}>"
break
end
end
end
これを実行すると
$ ruby sum2024.rb
2024 == (77..99).sum, <23>
2024 == (119..134).sum, <16>
2024 == (179..189).sum, <11>
のように、連続した整数の並びとその長さが表示される。
引数を与えるとその数で解く。eval
を使ったのは、式でも指定できるようにしたかったから。
(1...n)
のピリオドを2つにすると、自明な2024 == 2024..2024
も表示するようになる。
<>の中は並びの長さを表しているのだが、23, 16, 11はどこから来たのだろう。
そこで2024を素因数分解してみる。
# これを元のスクリプトに追加。
require 'prime'
p n.prime_division
すると下記の表示が追加されるようになる。
[[2, 3], [11, 1], [23, 1]]
奇数の11
と23
は、2024 = 11*184
と考えて184
を中心とした11
個の並び、または
2024 = 23*88
と考えて88
を中心とした23
個の並びを作ることに対応する。
一方、偶数の16は、因数の8を元にして2024 = 8*253 = 8*126 + 8*127
と考えて、右側の塊の先頭が127
となるような8+8
個の並びを作ることに対応する。
わかりにくいので 84=2*2*3*7
を例にして図にしてみる。
まず84=7*12
のような並びの数が奇数の場合。12
を中心にして、左右3つずつに対して左から右に階段状に移せば連続した7つの数の並びの出来上がりだ。
一方、84=4*21
と考えた場合は、21
を10+11
と分けることができて、4*10
と4*11
の2つの塊ができる。これも左から右に階段状に移せば連続した8
つの数の並びの出来上がり。
並びの長さが奇数の場合と偶数の場合で考え方が違うことが分かる。どちらも奇因数が大事なポイントになっている。2のべき乗の数は奇数を含まないので連続した整数の和で表すことができない。
良い問題ですね。今年の試験で使われるかな?