Chinaunix首页 | 论坛 | 博客
  • 博客访问: 268488
  • 博文数量: 138
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 971
  • 用 户 组: 普通用户
  • 注册时间: 2015-03-03 10:05
文章分类

全部博文(138)

文章存档

2016年(1)

2015年(137)

我的朋友

分类: C/C++

2015-07-26 19:41:06

N中要得到包含某个数k的个数,其实相当于[N/k] +[N/k2] +[N/k3] +[N/k4] +...。(不用担心这是无穷的运算,因为总

存在一个k,使得5^K>N,[N/5^K]=0.)

原理:首先,[N/k]等于1,2,3,...,N中能被k整除的数的个数,这是因为连续的整数中,每k个数中只会有一个能够整除k,所以1,2,3,...,N中就相当于划分了[N/k]个区域,每个区域只有一个数可以整除k,所以N!中含有k的个数即为[N/k];

然后,[N/k2]相当于1,2,3,...,N中能被k2整除的数的个数,但是这些数肯定是能够整除k的数的子集,所以本来应该是+2*[N/k2],现在就是+[N/k2]了

(一个解释:

   在书中给出了这个一个公式:N!中含有质因数2的个数 = [N/2] + [N/4] + [N/8] + ...( [N/k] 表示1,2,3,4,...,N中能被k整除的数的个数 )

    对于这个公式,自己现在还无法给出严格的数学证明,不过似乎也可以通过实例来理解。

    例子:

        当N = 8时, N! = 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 = (2*2*2) * 7 * (2*3) * 5 * (2*2) * 3 * (2) * 1

        1 ~ 8中:

            能被2整除的数有 2, 4, 6, 8    ( 8 / 2 = 4 )

            能被2^2(4)整除的数有 4, 8    ( 8 / 4 = 2 )

            能被2^3(8)整除的数有 8    ( 8 / 8 = 1 )

        一个数能被2整除,说明该数至少含有一个质因数2。

        一个数能被2^2整除,说明该数至少含有两个质因数2。

        ……

        可以把这个公式当做是一个统计过程——比如数字8,出现了3次,说明其包含了三个质因数2;4出现了两次,即包含两个质因数2;2, 6出现了一次,即分别包含一个质因数2

        最后将每次统计的结果相加,即为总的质因数2的个数:4 + 2 + 1 = 7

阅读(1178) | 评论(0) | 转发(0) |
0

上一篇:单例模式 C++实现

下一篇:scanf 和 gets

给主人留下些什么吧!~~