leetcode 233题1的个数

class Solution {
public:
    long long dp[20];
    long long miu[20];
    int nums[20];
    int countDigitOne(int n) {
        int len = 0;
        memset(dp,0,sizeof(dp));
        memset(miu,0,sizeof(miu));
        int x = n;
        int num = 0;
        while(x > 0) {
            nums[num] = x % 10;
            num++;
            x = x / 10;
        }
        //
        dp[0] = 0;
        dp[1] = 1;
        miu[0] = 0;
        miu[1] = 1;
        for(int i=2;i<11;i++) {
            miu[i] = miu[i-1] * 10ll;
        }
        for(int i=1;i<=11;i++) {
            dp[i] = dp[i-1] * 10ll + miu[i];
        }
        // for(int i=1;i<=10;i++) {
        //     cout << dp[i] << " " << miu[i] << "\n";
        // }
        int ans = 0;
        //1234
        //
        int tmp = n;
        for(int i=num-1;i>=0;i--){
            //
            cout << nums[i] << " " << dp[i] << " " << miu[i] << "\n";
            ans += dp[i] * nums[i];
            if(nums[i] > 1){
                ans += (miu[i+1]);
                tmp -= miu[i+1] * nums[i];
            }
            else if(nums[i] == 1){
                tmp -= miu[i+1] * nums[i];
                ans += tmp + 1;
            }
        }
        return ans;

    }
};
posted @ 2021-12-15 13:35  hh13579  阅读(10)  评论(0编辑  收藏  举报