微软面视:1的个数

来源:互联网 发布:服务器域名根目录在哪 编辑:程序博客网 时间:2024/06/15 20:36

问题描述:

      给定一个十进制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;
}

原创粉丝点击