受験算数の「約数の個数」の問題をPythonで解いてみた。

 受験算数の「約数の個数」の問題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)