1、题目
求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)
2、解题1:
class Solution {
public:
int NumberOf1Between1AndN_Solution(int n)
{
int count = 0;
for(int i = 1;i<=n;i++){
count += FindNum(i);
}
return count;
}
int FindNum(int n){
int count = 0;
while(n>0){
if(n%10 == 1){
count++;
}
n /= 10;
}
return count;
}
};
3、解题2:
分析:
/* 设N = abcde ,其中abcde分别为十进制中各位上的数字。
如果要计算百位上1出现的次数,它要受到3方面的影响:百位上的数字,百位以下(低位)的数字,百位以上(高位)的数字。
①如果百位上数字为0,百位上可能出现1的次数由更高位决定。比如:12013,则可以知道百位出现1的情况可能是:100199,11001199,21002199,,…,1110011199,一共1200个。可以看出是由更高位数字(12)决定,并且等于更高位数字(12)乘以当前位数(100)。
②如果百位上数字为1,百位上可能出现1的次数不仅受更高位影响还受低位影响。比如:12113,则可以知道百位受高位影响出现的情况是:100199,11001199,21002199,,…,1110011199,一共1200个。和上面情况一样,并且等于更高位数字(12)乘以当前位数(100)。但同时它还受低位影响,百位出现1的情况是:12100~12113,一共114个,等于低位数字(113)+1。
③如果百位上数字大于1(29),则百位上出现1的情况仅由更高位决定,比如12213,则百位出现1的情况是:100199,11001199,21002199,…,1110011199,1210012199,一共有1300个,并且等于更高位数字+1(12+1)乘以当前位数(100)。
*/
解题:
class Solution {
public:
int NumberOf1Between1AndN_Solution(int n)
{
int count = 0;
//位数循环
for(int i=1;i<=n;i*=10){
//当前位的高位
int high = n/(i*10);
//当前位
int cur = (n/i)%10;
//低位
int low = n%i;
//当前位为0
if(cur==0){
count +=high*i;
}
//当前位为1
if(cur==1){
count +=high*i+low+1;
}
//当前位>2
if(cur>1){
count +=(high+1)*i;
}
}
return count;
}
};