您的位置:首页 > 其它

写一个函数,计算0到n之间2的个数。

2015-10-14 10:52 204 查看


题目

写一个函数,计算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是需要单独考虑的,为了保持一致性,这里不做讨论。 将上面的三条结论应用到这就是:

1234当某一位的数字小于i时,那么该位出现i的次数为:更高位数字x当前位数当某一位的数字等于i时,那么该位出现i的次数为:更高位数字x当前位数+低位数字+1当某一位的数字大于i时,那么该位出现i的次数为:(更高位数字+1)x当前位数
代码如下:

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;

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: