题目:输入一个整数n,求从1到n这个n个整数的十进制表示中1(K=1)出现的次数,例如输入15, 则1到15中的整数中包含1的数字有1,10,11,12,13,14,15,共7次。
分析:这道题目首先第一个思路就是对1到15的整数,挨个求其中的1的个数,对n个数,每个数操作logn次,则复杂度为O(n*logn),较好的方法应该为根据数字的规律进行计算,从高位(左到右),异或从低位开始均可。先贴代码:
int countDigitOne(int n,int K) {
int numLeft = n, curDigit, curLevel = 1, residual, res = 0;
while(numLeft>0)
{
residual = (n % curLevel) + 1; //包含0,1,2,...,k
curDigit = numLeft % 10;
numLeft /= 10;
if(curDigit>=K) res += curDigit>K?curLevel:residual;
res += curLevel* numLeft;
curLevel *=10;
}
return res;
}
int main()
{
int result;
result=countDigitOne(325);
cout<<result<<endl;
return 0;