class Solution {
public:
int NumberOf1Between1AndN_Solution(int n){//找1到N有多少个1
if(n<1)return 0;//小于1就0吧
if(n<9)return 1;//个位数就是1个咯
int high=0; //当前位再高一位起往左高位的值
int k=0; //当前位起高位的值
int cur=0; //当前位的值
int count=0;//答案初始为为0
for(int i=1;k=n/i;i*=10){ //I是由右到左第I位(十进制),K是第I位起高位值
high=k/10; //一、取左边,HIGH是第I+1位起高位值
count+=high*i; //累加第I位左边的高位乘以第I位权(见解释)
cur=k%10; //二、取当前,CUR是当前第I位的值
if(cur>1) //如果大于1则可以再多一个权
count+=i; //COUNT继续累加
else if(cur==1) //如果当前位就是1,则累加值就要看右边低位
count+=n-k*i+1;//n-k*i就是第I-1起低位值,再加1(因为有全0)就是累加值
//如果N的当前位是0,则当前第I位是根本不可能有1了
}
return count;
}
};
找X数目
最新推荐文章于 2021-05-09 11:33:57 发布