//输入一个整数 n ,求1~n这n个整数的十进制表示中1出现的次数。 
//
// 例如,输入12,1~12这些整数中包含1 的数字有1、10、11和12,1一共出现了5次。 
//
// 
//
// 示例 1: 
//
// 
//输入:n = 12
//输出:5
// 
//
// 示例 2: 
//
// 
//输入:n = 13
//输出:6 
//
// 
//
// 限制: 
//
// 
// 1 <= n < 2^31 
// 
//
// 注意:本题与主站 233 题相同:https://leetcode-cn.com/problems/number-of-digit-one/ 
// Related Topics 数学 
// 👍 129 👎 0

/*
* 剑指 Offer 43 1~n 整数中 1 出现的次数
* 2021-02-18 11:41:34
* @author oxygenbytes
*/ 
#include "leetcode.h" 
//leetcode submit region begin(Prohibit modification and deletion)
class Solution {
public:
    int countDigitOne(int n) {
        vector<int> number;
        while(n) number.push_back(n % 10), n /= 10;
        //ab*c*def left=>ab right=>def t = power(10,c)
        // 0-(ab-1) c=1 t  ans += ab * t
        // ab 1. c = 0 ab * t ans += 0
        //    2. c = 1 def ans += def
        //    3. c = 2 t ans += t
        int ans = 0;
        for(int i = number.size() - 1;i >= 0;i--){
            int left = 0, right = 0, t =1;
            for(int j = number.size() - 1;j > i;j--) left = left * 10 + number[j];
            for(int j = i - 1;j >= 0;j--) right = right * 10 + number[j], t *= 10;
            ans += t * left;
            if(number[i] == 1) ans += right + 1;
            if(number[i] > 1) ans += t;
        }
        return ans;
    }
};
//leetcode submit region end(Prohibit modification and deletion)