输入一个整数,求1~n这n个整数的十进制表示中1出现的次数。例如,输入12,1~12这些整数中包含1的数字有1、10、11和12,1一共出现了5次。
思路:这又是一道时间优化题。
答案如下:
int NumberOf1Between1AndN(int n)
{
if(n<=0)
return 0;
char strN[50];
sprintf(strN,"%d",n);
return NumberOf1(strN);
}
int NumberOf1(const char* strN)
{
if(!strN||*strN<'0'||*strN>'9'||*strN=='\0')
return 0;
int first=*strN-'0';
unsigned int length=static_cast<unsigned int>(strlen(strN));
if(length==1&&first==0)
return 0;
if(length==1&&first>0)
return 1;
int numFirstDigit=0;
if(first>1)
numFirstDigit=PowerBase10(length-1);
else if(first==1)
numFirstDigit=atoi(strN+1)+1;
int numOtherDigits=first*(length-1)*PowerBase(length-2);
int numRecursive=NumberOf1(strN+1);
return numFirstDigit+numOtherDigits+numRecursive;
}
int PowerBase10(unsigned int n)
{
int result=1;
for(unsigned int i=0;i<n;i++)
result*=10;
return result;
}