桁数を数えるときに気をつけること

例えば\displaystyle{
1 \leq i \leq 1000
}の桁数をループを回しながら数えていくとき(かぞえた桁数は配列digitsにしまうものとする)。

#define _USE_MATH_DEFINES
#include "bits/stdc++.h"

using namespace std;
#define rep(i, n) for (ll i = 0; i < (ll)(n); i++)
typedef long long ll;

int main() {
    vector<int> digits(1000);
    ostringstream oss;
    string s;
    for (int i = 1; i <= 1000; i++) {
        oss.str(""); //初期化する!
        oss << i;
        s = oss.str();
        digits.at(i - 1) = s.size();
    }

    cout << digits.at(9);
}

ソースコード中にも書いたが,使ったostringstreamはループのたびに初期化する必要があることに注意。もちろん,桁数を数える関数を作っても良い。というか,こっちのほうが2, 3倍早かったっぽい:

int digit(int x) {
    int counter = 0;
    while (x != 0) {
        counter++;
        x /= 10;
    }
    return counter;
}

問題文によって2つは見極めて使っていこうと思う。