例1
N = int(input())
cnt = 0
for i in range(1, N+1):
if N % i == 0:
cnt += 1
print(cnt)
例2
N = int(input())
cnt = 0
for i in range(1, N//2 + 1):
if N % i == 0:
cnt += 1
print(cnt + 1)
例3
N = int(input())
nums = [1 for i in range(1, N//2 + 1) if N % i == 0]
print(len(nums) + 1)
#print(sum(nums) + 1)
#print(nums.count(1) + 1)
「 N を割り切る整数」とは、N % i == 0 が True になる i のことです。1 〜 N の中に True になる i がいくつあるかを求めるプログラムを書きましょうというのがこの問題です。
例1は、1 〜 N まで順に N % i を計算して求めています。言葉どおり順当なやり方です。
例2は、1 〜 N // 2 までしかループさせていません。これでも正しい結果が求められます。
N = 10 の時
i |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
N % i |
0 |
0 |
1 |
2 |
0 |
4 |
3 |
2 |
1 |
0 |
True? |
○ |
○ |
✕ |
✕ |
○ |
✕ |
✕ |
✕ |
✕ |
○ |
上の表を見ると、6 〜 9 は ✕ になっています。
6 〜 9 には 10 を割り切る整数は存在しません。これが N = 1000 の時で、N // 2 = 500 であっても i が 501 〜 999 の間に 1000 を割り切る整数は存在しないのです。
その代わりループが半分で止まりますので、N % N = 0 となる N の分を 1 加算します。print(cnt + 1)
の + 1
は、この N の分です。
例3は内包表記で書いてありますが、ただ内包表記で書いたわけではなく、if N % i == 0
が True の時に要素を 1
にして、要素数 = カウント回数としています。
また、要素の値が全て 1 なので、これを合計しても求められます。さらに 1
の数を数えることでも求められますし、1
ではなく True
にしても求められます。