完美解决微软求N包含1的个数
Benkong 2009-6-17
//问题描述
//设函数F(n),其中 n ~ (0, 2^32-1)
//为统计0 ~ n的所有整数所包含的1 的个数之和。
1 找规律:快速求出0-10^(n)-1之间1的个数
0-9 N1 1
00-99 N2=10*N1+10
不考虑最高位的情况
00-09
10-19
20-29
…
90-99
个位数1的个数 10*N1
最高位1的个数 10-19 10
结论:1的个数 N2=10*N1+10
000-999 10*N1+10
不考虑最高位1的个数
000-099
100-199
200-299
….
900-999
总个数为 10*N2
最高位1的个数 100-199 100
结论: 1的个数 N2=10*N2+100
归纳:
000…0-999…9 (n个9)
结论: 1的个数 Nn=10*N(n-1)+10^(n-1)
2 分析一个具体数 5467
求0000-5000的个数
设n=5(最高位数)
先不考虑最高位1的情况
0000-0999
1000-1999
2000-2999
3000-3999
4000-4999
1的个数位n*N3
再考虑最高位1的个数
若n>1,则包含1的个数位1000-1999 1000个
若n=1,则包含1的个数位后面的3位数+1 即 1000-1 XXX。如1324; 则1的个数位325
若n=0,则包含1的个数为0 如0234,实际上退化为3位数。
再考虑百位数
n=4,分析同上
先不考虑最高位1的情况
000-099
100-199
200-299
300-399
1的个数位n*N2
再考虑最高位1的个数
若n>1,则包含1的个数位100-199 100个
若n=1,则包含1的个数位后面的2位数+1 即 100-1 XX。如132; 则1的个数位33
若n=0,则包含1的个数为0 如5034。
再考虑10位数
分析完全同上
最后考虑个位数
若该各位>0,则必定包含1否则为0
归纳N位数中任意一位x(各位除外)
设***x**** 设x后面有n位数(n>1)
则x包含1的个数为
若x>1,则包含1的个数为:p=10^n个
若x=1,则包含1的个数为:p=后面的2位数+1
若x=0,则包含1的个数为:p=0。
则x包含1的个数=X*Nn+P
测试代码如下: