如果可以知道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