こんにちは!サトシ(@satoshi365_blog)です!
この記事では、「AtCoderに登録して最初に解くべき10問(AtCoder Beginners Selection)」の5問目「Some Sums」をめちゃくちゃ分かりやすく解説していきます。
AtCoder で問題を解くためには、新規登録しないといけません。
新規登録はこちらから → AtCoder に新規登録する
それでは、「Some Sums」の解説をしていきます!

5問目「Some Sums」で身につくスキル
この問題では、こんなスキルが身につきます。
- sum() の使い方
- str() の使い方
- for を文字列で繰り返す
先に、これがどのようなスキルなのかを説明します。
sum() の使い方
sum() を使うと、リスト中の数字の合計を計算できます。
例えば、このように書くと、リスト [1, 2, 3, 4] の合計を計算できます。
print(sum([1, 2, 3, 4)) # 10 と出力
str() の使い方
str() を使うと、数値を文字列に変えることができます。
例えば、このように書くと、数値 123 を文字列 ‘123’ に変えることができます。
print(str(123)) #'123' と出力
for を文字列で繰り返す
for はリストや range() だけじゃなくて、文字列にも使えます。
例えば、このように書くと、「’H’」、「’e’」、「’l’」、「’l’」、「’o’」と出力できます。
for i in 'Hello':
print(i)
# 'H' と出力
# 'e' と出力
# 'l' と出力
# 'l' と出力
# 'o' と出力
5問目「Some Sums」の解説
この順番で解説していきます。
- 問題文
- 入力例と出力例
- 解答例
- 解説
それでは見ていきましょう。
問題文
問題文
1 以上 N以下の整数のうち、10 進法での各桁の和が A 以上 B 以下であるものの総和を求めてください。制約
・1 ≤ N ≤ 104
・1 ≤ A ≤ B ≤ 36
・入力はすべて整数である入力
入力は以下の形式で標準入力から与えられる。N A B
出力
1 以上 N 以下の整数のうち、10 進法での各桁の和が A 以上 B 以下であるものの総和を出力せよ。
入力例と出力例
入力例
13 3 6
出力例
43
1以上13以下の整数のうち、各桁の和が3以上6以下のものは「3、4、5、6、12、13」です。
なので、これらの合計である「43」を出力します。
解答例
n, a, b = map(int, input().split())
ans = 0
for i in range(n + 1):
if a <= sum([int(x) for x in str(i)]) <= b:
ans += i
print(ans)
解説
N=13、A=3、B=6だったとします。この場合、このように計算していきます。
- 「0」の各桁の和が3以上6以下だったら、ans に各桁の和を足す
- 「1」の各桁の和が3以上6以下だったら、ans に各桁の和を足す
- 「2」の各桁の和が3以上6以下だったら、ans に各桁の和を足す
- …
- 「13」の各桁の和が3以上6以下だったら、ans に各桁の和を足す
では、コードを詳しく解説していきます。
まずは、n, a, b を受け取ります。
n, a, b = map(int, input().split())
整数の総和を求めるために、ans を作っておきます。
ans = 0
N 以下の整数の各桁を見ていくために、for を動かします。
for i in range(n + 1):
もし、各桁の和が A 以上 B 以下だったら、ans にその整数を足します。
if a <= sum([int(x) for x in str(i)]) <= b:
ans += i
※[int(x) for x in str(’13’)] を動かすと、[1, 3] というリストができます。
N 以下の整数を全部見終わったら、総和 ans を出力します。
print(ans)
まとめとして、もう一度プログラムを確認してみましょう。
n, a, b = map(int, input().split())
ans = 0
for i in range(n + 1):
if a <= sum([int(x) for x in str(i)]) <= b:
ans += i
print(ans)
これで「1 以上 N 以下の整数のうち、各桁の和が A 以上 B 以下であるものの総和」を求めることができました。
まとめ
もし分からない点などありましたら、気軽にTwitterなどでご質問ください^^
少しでも参考になれば嬉しいです!