第6回 素人のAtCoder日記(Beginners SelectionのB問題2つ目)

問題


自分の考え

とりあえずN以下の整数についてforで各桁の和を計算するのを作る。後はそれがA以上B以下なのかを判定するだけ。各桁の和を計算するのが若干面倒そう。

各桁をとるやり方はこちらを参考にした。

len(str(数値))

で文字列に変換し、文字列の長さを取得することで桁数を取得。


各桁へのアクセスは、-1が1の位、-2で10の位になるそう

str(数値)[-1] #で一の位を表示


とりあえず書いてみた。

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

num_list = [i+1 for i in range(N)]

sum_AB_ok = 0
for i_num in range(N):
    # 桁数の取得
    num_of_digits = len(str(num_list[i_num]))
    #print("数字: {}".format(i_num+1))
    #print("桁数: {}".format(num_of_digits))
    
    # それぞれの位の値の和を求める
    sum_digits = 0
    for i_digits in range(num_of_digits):
        sum_digits += int(str(num_list[i_num])[-i_digits])
    
    #print("各位の合計: {}".format(sum_digits)+"\n")
    
    # 各位の和の合計がA以下B以上かを判定しカウント
    if sum_digits>=A and sum_digits<=B:
        sum_AB_ok += i_num+1
    else:
        sum_AB_ok +=0

#print("答え: {}".format(sum_AB_ok))
print(sum_AB_ok)


通った



他の人の解答

同じ処理を繰り返すときに自分はfor文とイテレータで回しがちだけど、defで関数を定義したほうが分かりやすい。桁数の和はlist(map(int, str(numbers))をsum(上のlist)でやったほうがスマート

あとa <= x <= bという書き方ができるそう。

n, a, b = map(int, input().split())
 
def digit_sum(numbers):
    return sum(list(map(int, str(numbers))))
 
s = 0
for i in range(1, n + 1):
    x = digit_sum(i)
    if a <= x <= b:
        s += i
 
print(s)


おまけ



データサイエンス・機械学習を勉強し、記事にするための書籍代などに利用したいと考えています。サポートいただけると嬉しいです。