ABC083 B - Some Sums

備忘録

問題

atcoder.jp

回答

"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