Nov 10, 2010

计算1~n的十进制数中1出现的次数

例如 n=12,则包含1的数为1,10,11,12,共出现5次

如果可以知道1~n中第k位出现1的次数,则答案为所有位置出现1的次数之和。

对于第k位,把n看作三部分,(hnum) nk  (lnum)
比如 12023 的百位(k=2),看为 12 0 23
分情况
nk = 0,只能是 (0-11) 1 (0-99),故有 hnum*10^k
nk=1, 则 (0-11) 1 (0-99) 或者 12 1 (0-23) 故有hnum*10^k + lnum+1
nk>1,则 (0-11) 1 (0-99) 或者 12 1 (0-99)  故有  hnum*10^k + 10^k


int count1s(int n)
{
 int base=1;
 int hnum=n/10;
 int lnum = 0;
 int nk = n%10;

 int count=0;


 while(hnum!=0 || nk!=0)
 {
  switch (nk)
  {
  case 0:
   count += hnum*base;
   break;
  case 1:
   count += hnum*base+lnum+1;
   break;
  default:
   count += hnum*base+base;
  }
  lnum += base*nk;
  nk = hnum % 10;
  hnum /= 10;
  base *= 10;
 }
 return count;
}

0 comments: