题目
写一个函数,计算0到n之间2的个数。
解答
最简单直观的方法就是对于0到n之间的数,一个个地去统计2在它们上出现的个数, 然后累加起来即可。求2在某个数上出现的次数需要O(logn)的时间,一共有n个数, 所以共需要O(nlogn)的时间。
如果我们把问题一般化一下:写一个函数,计算0到n之间i出现的次数,i是1到9的数。 这里为了简化,i没有包含0,因为按以上的算法计算0出现的次数, 比如计算0到11间出现的0的次数,会把1,2,3,4…视为01,02,03,04… 从而得出错误的结果。所以0是需要单独考虑的,为了保持一致性,这里不做讨论。 将上面的三条结论应用到这就是:
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
int
Countis(int
n,
int
i){
if(i<1
||
i>9)
return
-1;//i只能是1到9
int
count
=
0;
int
factor
=
1;
int
low
=
0,
cur
=
0,
high
=
0;
while(n/factor
!=
0){
low
=
n
-
(n/factor)
*
factor;//低位数字
cur
=
(n/factor)
%
10;//当前位数字
high
=
n
/
(factor*10);//高位数字
if(cur
<
i)
count
+=
high
*
factor;
else
if(cur
==
i)
count
+=
high
*
factor
+
low
+
1;
else
count
+=
(high
+
1)
*
factor;
factor
*=
10;
}
return
count;
}
|