ABC083 B - Some Sums
備忘録
問題
回答
"use strict" function Main(input) { input = input.trim().split(' ').map(Number); const n = input[0]; const a = input[1]; const b = input[2]; let ans = 0; for(let i=1; i<=n; ++i){ let o = i; let calc = 0; while(o>0){ calc += o%10; o = Math.floor(o/10); } if(a<=calc && calc<=b){ ans += i; } } console.log(ans); } Main(require("fs").readFileSync("/dev/stdin", "utf8"));
考え方
考える点は2つ
- 10進法で各桁の和の算出
- 小数点以下の切り捨て
10進法での各桁の和を求めるには、10で割ったあまりを桁数回繰り返せばよい。
例えば、123
であれば
1. 123 % 10 = 3
2. 12 % 10 = 2
3. 1 % 10 = 1
4. 各桁の和は 3+2+1=6
あとは上記の計算を実現するために、元の数字を10で割って、小数点以下を切り捨てることで
各桁の和を算出することが出来る。
1. 123 % 10 = 3
1'. 123 / 10 = 12.3 // 小数点以下を切り捨てて、12
を次の値として使用する
2. 12 % 10 = 2
2'. 12 / 10 = 1.2 // 小数点以下を切り捨てて、1
を次の値として使用する
3. 1 % 10 = 1
3'. 1 / 10 = 0.1 // 小数点以下を切り捨てると、0
になるため、処理を終了する
4. 各桁の和は 3+2+1=6