0
0

More than 1 year has passed since last update.

文系卒が数学オリンピックをPythonで解く(2020年予選編)

Last updated at Posted at 2021-11-06

これまでのあらすじ

  • 文系卒の私。でも数学になじみたい。
  • ふむふむ、数学オリンピックというのがあるらしい。やってみますか。
  • 紙とペンを使ってマジメに解く文系卒。えらい、えらいぞ!
  • 5分後にふと衝撃走る。「これPythonでやったほうが早くない?」
  • そんな、いつか 誰かに 本気で怒られそうな気づきを 実行したのであった──。

ルール

  • 数学オリンピックの問題をPythonで解く。
  • ライブラリは可能な限り使わない。例外的にitertoolsは使う。
  • 図形の問題は挑戦しないかも。許してね。
  • 式変形すれば解けるようなものも面白味がないので対象外。

引用元

問題はこちらから引用しております。

第30回(2020年)JMO予選の問題 - 数学オリンピック

Q1

問題

千の位と十の位がともに2であるような4桁の正の整数のうち、7の倍数はいくつあるか。
第30回(2020年)JMO予選の問題 - 数学オリンピック

考える

これは考えるより書くが易しですね。

仕様

  • 千の位と十の位がともに2であるような4桁の正の整数を作成する。
  • 作成した整数に対して、7で割り切れるかを判定する。
  • 7で割り切れる場合、リストに格納する。
  • リストの要素数を数える。

コーディング

特に変わったことはしていません。
(itertoolsのデカルト積を使えば二重のfor文は防げますが、割愛。)

nums =[]
for n in range(10):
    for m in range(10):
        num = '2'+str(n)+'2'+str(m)
        num = int(num)
        if num % 7 == 0:
            nums.append(num)
print(nums)

# 実行結果 -> [2023, 2121, 2128, 2226, 2324, 2422, 2429, 2520, 2527, 2625, 2723, 2821, 2828, 2926]

要素数の表示。

print(len(nums))

# 実行結果 -> 14

答え:14個

Q4

問題

正の整数nであって、n2 とn3 の桁数の和が8であり、 n2 とn3 の各桁合わせて1以上8以下の整数がちょうど1個ずつ表れているようなものを全て求めよ。
第30回(2020年)JMO予選の問題 - 数学オリンピック

考える

こういう問題はプログラミング向きで楽しいですね。
初手コーディングでいきましょう。

仕様

  • 整数nを作成する。
  • n**2n**3を計算し、以下の条件を満たすか判定する。(AND条件)
    • 合計が8桁か判定する。
    • その8桁に1,2,3,4,5,6,7,8が1回ずつ登場する。
  • 条件に合致すれば、nをprintする。
  • 条件に合致しなければ、整数nに1を加算する。

コーディング

n = 1
while n < 1000:
    str_n = str(n**2)+str(n**3)
    if len(str_n) == 8:
        results = []
        for _ in range(1,9):
            result = str(_) in str_n
            results.append(result)
        if sum(results)==8:
            print(n)
    n += 1

# 実行結果 -> 24

なお、n=24の場合、n*2とn*3は以下のようになります。

str(n**2),str(n**3)

# 実行結果 -> ('576', '13824')

答え:24

続く──。

0
0
0

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
0
0