问题描述:
给定一个十进制n,统计从 1 到 n的所有数中含有"1"的个数;
例如n=10;
那么 1 和 10都含有"1",即此时为2
要求:
算法的时间复杂度不得超过o(n);
具体方案:
分析:
xxxxx0xxxxx
xxxxx1xxxxx
xxxxx2xxxxx
xxxxx3xxxxx
....
.
.
.
xxxxx9xxxxx
不为"x"的数即我们要分析的数位,这个数位为"1"的情况可分为2部分:
高位相关(不包括该位),: 高位的数值*100000(该位在第六位)
低位相关(不包括该位),又分为2种情况:1)该位小于1,即为0 这是这个部分记0处理
2)该位大于等于1,这个部分记为: 低位数字值再加1
如此从低位到高位逐一考虑累加就会得到"1"的总个数.
具体代码(vs2005, win32,c++)
unsigned long count(unsigned long n);
int _tmain(int argc, _TCHAR* argv[])
{
printf("%ld/n",count(100));
return 0;
}
unsigned long count(unsigned long n)
{
unsigned long int num=0;
int CurNum;
unsigned long HighNum,LowNum;
//依次有低位到高位考虑1的个数
short int cur;
unsigned long int factor=1;
unsigned long int high;
unsigned long int low;
unsigned long int count=0;
while(n/factor)
{
//取出高位
high=n/(factor*10);
//取出低位
low=n%factor;
//取出当前位
cur=(n/factor)%10;
switch(cur)
{
case 0:
count+=(high*factor);
break;
case 1:
count+=(high*factor);
count+=(low+1);
break;
default:
count+=(high*factor);
count+=factor;
break;
}
factor*=10;
}
return count;
}