1の位と10の位と……10000の位の数字を合計したい!ABC083B

目次

 

問題

atcoder.jp

 

 回答


N,A,B=gets.split.map(&:to_i)
 
def calc(n)
res=0
while n>0
res+=n%10
n/=10
end
return res
end
 
ans=0
for i in 1..N
digit_sum=calc(i)
if A<=digit_sum and digit_sum<=B
ans+=i
end
end
puts ans

 

学んだ処理

他の方(cumet04様)の回答には文字列操作、配列操作をする解法が使われていて勉強になりました。 

N, A, B = gets.split.map(&:to_i)
 
puts (0..N).select { |n|
sum = n.to_s.split("").map(&:to_i).sum
sum >= A && sum <= B
}.sum

1. 入力を受け取る

N, A, B = gets.split.map(&:to_i)

gets「入力を受け取り」

.split「スペースの区切りで1つ1つ分けて」

.map(&:to_i)「整数型で配列にして」

N, A, B =「3つの変数に代入する」

docs.ruby-lang.org

2. 整数の各桁の総和を計算

sum = n.to_s.split("").map(&:to_i).sum

配列(0..N) の要素の1つ1つについて、

.to_s「文字列にして、」

.split("")「各桁(0~9のどれか)を1つずつ」

.map(&:to_i)「整数の要素として配列にして」

.sum「その配列の要素を合計して」

 sum = 「sumに代入する」

docs.ruby-lang.org

3. 配列から A <= sum <= B を満たす整数を選ぶ

puts (0..N).select { |n|
sum = n.to_s.split("").map(&:to_i).sum
sum >= A && sum <= B
}

sum >= A && sum <= B「sumの値が A <= sum <= B を満たす場合」

.select「sumを配列 |n| の要素として選び出す」

4. 配列 |n| の要素の合計を出力する

puts (0..N).select { |n|
sum = n.to_s.split("").map(&:to_i).sum
sum >= A && sum <= B
}.sum

 .sum「配列 |n| の要素の合計を返す」

 puts 「合計を出力する」