题目描述:
求出1~13的整数中1出现的次数,并算出100~1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1、10、11、12、13因此共出现6次,但是对于后面问题他就没辙了。ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数。具体分析 参照《剑指offer》
代码实现:
#include <iostream>
#include <math.h>
using namespace std;
int NumberOf1(const char* strN)
{
if(!strN || *strN<'0' || *strN>'9' || *strN=='\0')
return 0;
int first = *strN-'0'; //first输入数字的第一位
int len = strlen(strN);
if(first==0 && first==1)
return 0;
if(len==1 && first>0)
return 1;
//假设strN是“21345”
//numFirstDigit是数字10000-19999的第一位中的数目
int numFirstDigit = 0;
if(first==1)
numFirstDigit=atoi(strN+1)+1;
else
numFirstDigit=pow(10,len-1);
//numOtherDigit是1346-21345除了第一位之外的数位中数目
int numOtherDigits=first*(len-1)*pow(10,len-2);
cout<<"dangqian :"<<first<<" "<<len<<endl;
//numRecursive是1-1345中的数目
int numRecursive=NumberOf1(strN+1);
cout<<" numFirstDigit :"<<numFirstDigit<<" numOtherDigits: "<<numOtherDigits<<endl;
return numFirstDigit+numOtherDigits+numRecursive;
}
int NumberOf1Between1AndN(int n)
{
if(n <= 0 )
return 0;
char strN[50];
sprintf(strN,"%d", n);
return NumberOf1(strN);
}
void main()
{
cout<<NumberOf1Between1AndN(21345)<<endl;
}