備忘録

徒然なるままに。

ABS083B

AtCoder、ABS083Bを解いた。

自分のコード

N, A, B = map(int, input().split())
t = 10000

def val_sum(val,t):
    res = 0
    while t > 0:
        r = val // t
        val = val % t
        t = t // 10
        res += r
    
    return res

ans = 0

for i in range(N+1):
    if val_sum(i,t) >= A and val_sum(i,t) <= B:
        ans += i
        
print(ans)

関数内は与えられた数値の商を求めることで各桁の値を分解して和を求めている。
わざわざこんなことしなくても数列的に分解できるんだろうなぁと思いながら書いた。
実際にそれを再現しているコードが以下。

a, b, c = map(int, input().split())
count = 0
for ele in range(a + 1):
    digits = list(map(int, list(str(ele))))
    if b <= sum(digits) and sum(digits) <= c:
        count += ele
print(count)

Submission #39744452 - AtCoder Beginners Selectionより引用

for分の回し方は同じ。digitsの部分でeleを文字列的に分解してint形に直してlistに変換。そのsumを用いている。
標準入力を応用していて(応用もへったくれもないか)こちらの方がキレイ。

if A <= sum(list(map(int, str(i)))) <= B:

Submission #39742834 - AtCoder Beginners Selectionより引用

これが最もシンプルかな。やっていることは二つとも同じこと。

数値判定の時は算数的な発想だけじゃなく言語を生かした発想が大事だと思った。