8
2
記事投稿キャンペーン 「2024年!初アウトプットをしよう」

2024年の数学の問題をRubyで

Last updated at Posted at 2024-01-11

注)コメントをもとに問題文を修正しました(ありがとうございます!)。また、図を追加しました。

2024年に出るかもしれない数学の問題で気に入ったやつをRubyでやる。

2024を2個以上の連続した正の整数の和で表しなさい。(ただしRubyは使ってよいこととする。)

大人になると問題を解くのにRubyを使ってもよいのだ。

sum2024.rb
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]]

奇数の1123は、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つの数の並びの出来上がりだ。

odd.png

一方、84=4*21と考えた場合は、2110+11と分けることができて、4*104*11の2つの塊ができる。これも左から右に階段状に移せば連続した8つの数の並びの出来上がり。

even.png

並びの長さが奇数の場合と偶数の場合で考え方が違うことが分かる。どちらも奇因数が大事なポイントになっている。2のべき乗の数は奇数を含まないので連続した整数の和で表すことができない。

良い問題ですね。今年の試験で使われるかな?

8
2
8

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
2