題目描述
求出1~13的整數中1出現的次數,並算出100~1300的整數中1出現的次數?爲此他特別數了一下1~13中包含1的數字有1、10、11、12、13因此共出現6次,但是對於後面問題他就沒轍了。ACMer希望你們幫幫他,並把問題更加普遍化,可以很快的求出任意非負整數區間中1出現的次數。
分析
較爲複雜的分析:
對於一個數字,如55342
1、對於個位,由於是十進制,所以每10個數出現一個1,那麼總共多少個10呢,就是5534個10,
也就是十位數之前的數字,而2大於等於1,所以還要加上1.
2、對於十位,每100個數中會出現10個1,(10,11,12,13...),總共553個100,而如果十位數大於1那麼就是553*10個1,
.......
對於個位:假設個位數是number(2),個位數之前截取結果爲weight(5534),1的總數爲res
如果number>=1,res = weight+1,
否則,res=weight
對於十位:假設十位數是number(3),十位數之前截取結果爲weight(553),1的總數爲res,十位數之後的截取結果爲former (4)
如果number>1,res = weight*10,如果number==1,res =(weight)*10+former+1
如果number<1,res = (weight)*10,
對於百位:假設百位數是number(5),十位數之前截取結果爲weight(5),1的總數爲res,十位數之後的截取結果爲former(34)
如果number>1,res = weight*100,如果number==1,res =(weight)*100+former+1
如果number<1,res = (weight)*100,
.。。。。。。
代碼實現
int NumberOf1Between1AndN_Solution(int n)
{
int former=0,weight=0,number=0;
int res = 0;
int base = 1;
while(n!=0){
number = n%10;
weight = n/10;
if(base == 1){
if(number>=1)
res += weight+1;
else
res += weight;
}
else{
if(number>1)
res += (weight+1)*base;
if(number==1)
res += (weight)*base+former+1;
if(number<1)
res += (weight)*base;
}
former+=number*base;
base*=10;
n=n/10;
}
return res;
}