【競プロ】1日1AC : ABC83 B問題

昨日までEDPCの問題をやっていましたが、しばらくお休みにします。

今日の問題はこちら。

普段扱う問題よりは簡単だと思うので、是非解いてみてください。

提出コードと考え方

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

int main(){
    int N,A,B;
    cin >> N >> A >> B;
    int ans = 0;
    for(int i = 1;i <= N;i++){
        string s = to_string(i);
        int sum = 0;
        for(int j = 0;j < s.size();j++){
            sum += s[j] - '0';
        }
        if(A <= sum && sum <= B) ans += i;
    }
    cout << ans << endl;
    return 0;
}

ある数を10進法で表した時の各桁の総和が求められればあとは楽ですね。

ある数の各桁の和を求めるにはいくつか方法が考えられると思いますが、ここでは文字列に変換することを考えましょう。各桁を独立に扱えますが、\(s[j]\) は文字なので計算に使うには数値に変えなければいけません。

文字は番号で整理されています。例えば「char c = '0'として(int)cを出力」すると、「48」のように数値が出力されるはずです。文字 \( 0,1,2,\cdots,9 \) は順番に並んでおり、内部的には \( 48,49,50,\cdots ,57\)  となっています。

すなわち数字(文字)から '\(\ 0\ \)'(\( =48\)) を引くと、その文字が数値(計算に使える)に変わります。

これが分かれば、後は問題文の条件を満たすかどうかなどを考えれば終わりです。

コメント