けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AtCoder ABC 083 B - Some Sums (6Q, 灰色, 200 点)

整数の「各桁の和」を求める問題

問題概要

1 以上  N 以下の整数のうち、10 進法での各桁の和が  A 以上  B 以下であるものの総和を求めてください。

考えたこと

まず、整数  n の各桁の和を求める方法を確認しておこう。それについては、この記事に書いた。

drken1215.hatenablog.com

各桁の和を求める部分を関数化すると考えやすくなるので、これからは整数 n の各桁の和を求める関数を calc(int n) などとする。

そうすると、 n = 1, 2, \dots, N に対して、calc(n) A 以上  B 以下になるものについて、その総和を求めればよい。

コード

#include <bits/stdc++.h>
using namespace std;

int calc(int n) {
    int res = 0;
    while (n > 0) {
        res += n % 10;
        n /= 10;
    }
    return res;
}

int main() {
    int N, A, B;
    cin >> N >> A >> B;

    int res = 0;
    for (int n = 1; n <= N; n++) {
        int wa = calc(n);
        if (wa >= A && wa <= B) res += n;
    }
    cout << res << endl;
}