如果可以知道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:
Post a Comment