#これまでのあらすじ
- 文系卒の私。でも数学になじみたい。
- ふむふむ、数学オリンピックというのがあるらしい。やってみますか。
- 紙とペンを使ってマジメに解く文系卒。えらい、えらいぞ!
- 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**2
とn**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の場合、n2とn3は以下のようになります。
str(n**2),str(n**3)
# 実行結果 -> ('576', '13824')
答え:24
#続く──。