题解:P1179 [NOIP2010 普及组] 数字统计

· · 题解

解题思路

对于十进制数,取模 10 可获得当前数的个位,整除 10 可去掉当前数的个位,要获取当前数的每一位可以循环取个位,去个位,直到这个数被拆分为 0。因此观察数据范围后只需要枚举区间 [L,R] 内的所有数进行拆分并统计即可,时间复杂度为 O(n\log n)

代码实现

#include<bits/stdc++.h>
using namespace std;
int main() {
    int L, R, ans = 0;
    cin >> L >> R;
    for (int i = L; i <= R; i++) {  //枚举区间[L,R]的数
        int n = i;  //避免i变成0造成死循环备份i的值
        while (n) {
            if (n % 10 == 2) ans++; //个位为2累加答案
            n /= 10;
        }
    }
    cout << ans;
    return 0;
}