题目
写一个函数,计算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
;
}
|