🎃

【AtCoder解説】ABC083B - Digits Sum Compare を解いた記録

に公開

本記事は、AtCoder の問題を解いて得た知見を記録するための学習ログです。
毎回1問ずつ、「何を考えて解いたか」「どう実装したか」「学んだこと」を簡単にまとめていきます。

問題概要

数字の各桁の和が a〜b の範囲内にある数を集めて合計する問題

解放とコード

x, a, b = map(int, input().split())
sum = 0
subsum = 0
for i in range(x + 1):
  if i == 0:
    continue
  subsum = 0
  nums = list(str(i))
  for num in nums:
    subsum += int(num)
  if a <= subsum and subsum <= b:
    sum += i
print(sum)

特筆なし

解きながら考えたこと・学んだこと・感じたこと

  • list()を使うことで、各桁を分解して配列に格納すること

AIの評価

  • sumは組み込み関数があるので避けるべき
  • iが0の時continueするというロジックはrange(1, x + 1)と書くことでことが済む
  • nums = list(str(i))
    for num in nums:
      subsum += int(num)
    
    これを
    for c in str(i):
      subsum += int(c)
    
    とすることができる

綺麗な回答

x, a, b = map(int, input().split())
total = 0

for i in range(1, x + 1):
    subsum = 0
    for c in str(i):
        subsum += int(c)
    if a <= subsum <= b:
        total += i

print(total)
for c in str(i):

この部分は、list(文字列)で各桁を配列に格納できるのと同じように、私の予想だけど、cのように文字列と配列は内部的に共通するものであるからできることだと感じた。つまり先のコードのように文字列にすれば配列として処理することができるといことである。

Discussion