public int NumberOf1Between1AndN_Solution(int n) {
        //出现的总数其实就是各个位置上的1的个数的和
        //当前位,n(i),cur
        //高位n(N)....n(i+1),high
        //低位n(i-1)...n(1),low
        //注意当前位出现1的个数其实是和当前位的digital是挂钩的,比如是十分位,那么可能有10...19出现1,有10个
        //而百分位就成了100...199出现1,有100个数,以此类推
        //而像是10分位的1,有几个10...19出现呢?这就看高位了,至少会有0~high-1共有high个

        //不管是当前位是什么,总会有(0~high-1) * digital的基本盘,就是看当前位的值决定是否能多捞点
        //如果当前位是0如2007的第二位,那么在当前位可能出现1的次数为,         high*digital
        //如果当前位是1如2017的第二位,那么在当前位可能出现1的次数为           high*digital+low+1
        //如果当前位是2...9如2037的第二位,那么在当前位可能出现1的次数为       (high+1)*digital
        int cur = n % 10;
        int high = n / 10;
        int low = 0;
        int digital = 1;
        int res = 0;
        while(cur!=0||high!=0){
            res+=high*digital;
            if(cur==1){
                res+=low+1;
            }else if(cur!=0){
                res+=digital;
            }
            low += cur * digital;
            digital *= 10;
            cur = high%10;
            high /= 10;
        }
        return res;
    }