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