まずは次のような単純化した問いを考えましょう。
「 から までの中に, の倍数は何個あるか?」
この問いの答えは, を で切り捨て除算 (小数点以下切り捨ての割り算)した値として得ることが出来ます。
例えば「 から までの中に, の倍数は何個あるか?」だと
15 // 4
を計算して, 個となることが分かります。
これを利用して 「 から までの中に, の倍数は何個あるか?」という今回の問題に答えます。
「 から までの中に, の倍数は何個あるか?」の答えから
「 から までの中に, の倍数は何個あるか?」の答えを
引くことによって, 以上 以下の範囲内にあるの倍数の個数を求めることが出来ます。
xxxxxxxxxx
A = int(input())
B = int(input())
X = int(input())
C = B // X # 1 以上 B 以下のうち, Xの倍数であるものの個数
D = (A - 1) // X # 1 以上 A-1 以下のうち, Xの倍数であるものの個数 (A = 1のときは0個)
print(C - D)
以上 以下の自然数について, 「で割り切れるか?」を一つずつ確認していく方法もあります。
この方法を取るには ループ と 条件分岐 について学ぶ必要があります。
xxxxxxxxxx
A = int(input())
B = int(input())
X = int(input())
ans = 0
for n in range(A, B + 1): # AからBまでループを回す
if n % X == 0: # もしもXの倍数ならば
ans = ans + 1 # 答えを1増やす
print(ans)
今回の問題では という制約がありました。
つまり, ループを回す解法だと計算量最悪の場合()で 回のループを回す必要があります。
( は で割り切れるか?, は割り切れるか?, は... を の値まで延々と繰り返していく)
ループを回す回数が多くなるほど計算に要する時間は増えていきます。
( = , = 兆 のとき, から兆 まで一つずつ調べていると現実的な計算時間では終わりません)
しかし, 四則演算だけで解いた方法だとループを1度も回さないので, の値がどんなに大きくなっても一瞬で答えを求めることが出来ます。
四則演算だけで解いた方法は, 計算量が改善された「賢い」方法なのです。
このように問題解決に どのようなアプローチをとるか (= どんな アルゴリズム を考案・設計するか) が重要です。