题目描述
求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数)。
class Solution {
public:
//N为9或者99或者999.....
int cal_way(int N)
{
if(N/10==0)return 1;
return 10*cal_way(N/10)+N/10+1;
}
int NumberOf1Between1AndN_Solution(int n)
{
if(n==0)return 0;
if(n<10)return 1;
string temp=to_string(n);
int mark_n=1;
int mark_i=temp.size()-1;
while(mark_i>0)
{
mark_n*=10;
mark_i--;
}
int value=cal_way(mark_n-1);
int the_number=n/mark_n;
int res=0;
//只有开通为1的时候不同0,2-9的1的个数都相等,例如000-099等于200-299
if(the_number>=2)
{
res=the_number*value+mark_n+NumberOf1Between1AndN_Solution(n%mark_n);
}
//递归思想
else
{
res=value+NumberOf1Between1AndN_Solution(n%mark_n)+n%mark_n+1;
}
return res;
}
};