競技プログラミングをpythonで遊ぶ4[ABC106 B]

コンテストページはこちら↓

問題文
105という数は, 非常に特殊な性質を持つ - 奇数なのに, 約数が8個もある.
さて, 1以上 N以下の奇数のうち, 正の約数をちょうど 8個持つようなものの個数を求めよ.
制約
・ Nは 1 以上 200 以下の整数

考察
奇数で約数が8個あるのは特殊な性質らしいからそれ全部求めて足せばいいのでは?

解答1

>>> for i in range(200)[1::2]:
...  div = 0
...  for j in range(i+1)[1:]:
...   if i % j == 0:
...    div += 1
...  if div == 8:
...   print(i)
...
105
135
165
189
195

200までだと105, 135, 165, 189, 195の5つらしい
ちなみにrangeの後ろの[1::2]は[1]から2つとばしという意味、便利

>>> list(range(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> list(range(10)[::2])
[0, 2, 4, 6, 8]
>>> list(range(10)[1::3])
[1, 4, 7]

後はさっきの数字を使うだけ

N = int(input())

# 105, 135, 165, 189, 195
def N_checker(num):
    return 1 if N >= num else 0

res = 0
for i in [105, 135, 165, 189, 195]:
    res += N_checker(i)

print(res)

N_checker関数を用意した意味はそんなにない

解答2
愚直に 1 から N まで調べて約数が8個の奇数があるたびに数えればいいし、そのほうが拡張性がある。。。

N = int(input())

res = 0

for i in range(N+1)[1::2]:
    div = 0
    for j in range(i+1)[1:]:
        if i % j == 0:
            div += 1
    if div == 8:
        res += 1

print(res)

Nも含めて調べたいときは+1を忘れないように気を付けよう!

以上!

この記事が気に入ったらサポートをしてみませんか?