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