受験算数の「約数の個数」の問題をPythonで解いてみました。(^_^;
前回の記事の問題の類題で、2012年度の東大寺中の問題らしいです。(^_^;
一方の面が白、もう一方の面が赤のカード100枚の両面にそれぞれ1から100までの数字が書かれています。ただし、どのカードもその両面には同じ数字が書かれているとします。すべてのカードの白の面を上に向けて並べてから、次の[1]〜[100]の作業を行います。
[1] 1の倍数の数字が書かれたカードをすべて裏返す。
[2] 2の倍数の数字が書かれたカードをすべて裏返す。
[3] 3の倍数の数字が書かれたカードをすべて裏返す。
…
[98] 98の倍数の数字が書かれたカードをすべて裏返す。
[99] 99の倍数の数字が書かれたカードをすべて裏返す。
[100] 100の倍数の数字が書かれたカードをすべて裏返す。(1) 3回裏返されたカードに書かれている数字をすべて答えなさい。
(2) 赤の面が上を向いているカードは全部で何枚ありますか。
(3) 4回裏返されたカードに書かれている数字のうち,小さいほうから4番目の数字を答えなさい。
数学的な解き方は、参考URLの先生の説明がわかりやすいのでここでは省略します。(^_^;
プログラムでは、リストcardに、先頭のcard[0]はダミーとして、card[1]〜[N=100]まで要素を用意して、裏返した回数をカウントしていきました。そして、操作が終わった後、設問(1)〜(3)の条件を満たすカード番号をそれぞれ、リストhit1〜hit3に拾っていきました。
● NumberOfDivisors1.py
# coding: UTF-8 # NumberOfDivisors1.py from time import time def main(): tm = time() # Timer Start N = 100 # カードをcard[1]〜[N]まで用意。card[0]はダミー card = [0]*(N+1) for i in range(1,N+1): for j in range(1,N+1): if j%i==0: card[j]+=1 ## print(card) hit1 = [] for i in range(1,N+1): if card[i]==3: hit1.append(i) hit2 = [] for i in range(1,N+1): if card[i]%2==1: hit2.append(i) hit3 = [] for i in range(1,N+1): if card[i]==4: hit3.append(i) print("(1) %s"%hit1) ## print(hit2) print("(2) %d"%len(hit2)) ## print(hit3) print("(3) %d"%hit3[4-1]) print("Runtime : %.3f [sec]"%(time()-tm)) # Timer Stop & Disp if __name__ == '__main__': main()
●実行結果
(1) [4, 9, 25, 49] (2) 10 (3) 14 Runtime : 0.003 [sec]
※参考URL
●約数 - Wikipedia
●今年の「2題!?」 | 前田昌宏の中学受験が楽しくなる算数塾
●質問の箱と球の問題をPythonで解いてみた。 - rscの日記
●受験算数の「約数の個数」の問題をPythonで解いてみた。(2)