51Nod 1009 数字1的数量(思维)

题目链接

题目大意

  略

解题思路

  可以逐位考虑当前数位上数字为1时的数字数量然后累加起来,因为每次只考虑当前数位的贡献,所以在计算过程中不存在重复的问题。
  举个例子,比如1361092,我们用x代替0~9十个数字。
  1.对于当前位的数字,如果大于1,比如说9的情况,那么十位为1的数字,也就是1x - 136101x就有((13610+1) imes 10))个,其中13610是比十位更高的数字,加上的1是当前十位上的1,为什么还乘十呢?因为后面有1个x,代表后面可以有10种数字。
  2.如果等于0呢?和第一种情况类似,不过需要向前借1,比如到了百位,就是1xx-13601xx,贡献就是((1361-1+1) imes 100))
  3.如果是1呢?这时候我们发现,加入1后面如果不全是9,是取不到上面那么多数的,比如1xxx-1361092,后者取到1092就结束了,不可能到9999,那么还采用第2种方法,向前借1,1xxx-1351xxx肯定是都能取到了,剩下的就是1361000-1361092了,这里取模就行了,所以贡献就是((136-1+1) imes 1000 + 1361092%1000))

代码

int main() {
    ll n; cin >> n;
    ll mul = 1, m = n, ans = 0;
    while(n) {
        ll res = n%10;
        if (res>1) ans += (n/10+1)*mul;
        else if (!res) ans += n/10*mul; 
        else ans += n/10*mul+m%mul+1;
        mul *= 10; n /= 10;
    }
    cout << ans << endl;
    return 0;   
}
原文地址:https://www.cnblogs.com/shuitiangong/p/13588604.html