博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
编程之美读书笔记之---”不要被阶乘吓到“
阅读量:5087 次
发布时间:2019-06-13

本文共 1000 字,大约阅读时间需要 3 分钟。

问题一:给定一个整数N,那么N的阶乘末尾有多少个0呢?例如N = 10, N! = 362800,N! 的末尾有两个0.

问题二:求N! 的二进制表示中,最低位1的位置。

 

问题一的解法一:

最简单的方法就是把N! 算出来,就可以知道末尾有多少个0了。

问题一的解法二:

我们这样想,末尾的0可以从哪里得到呢,10的倍数,例如像10,20,100....这样的,可以贡献0,还有就是2 * 5这样也可以得到一个0,不过我们可以发现,10其实也是从5得来的,

10 = 2 * 5,

20 = 4 * 5,

100 = 20 * 5

所以,我们可以得出,有多少个0,就看N!的因式分解中含有多少个5,。至此,成功的将原问题转化成一个更简单的问题。

利用这个原理,我们提出两种解决方法求因式分解中因子5的个数:

1、第一种方法很简单,就是直接拆分5出来

int tot = 0;    //因子5的个数

for(int i = 1;i <= N;i++)

{

    int temp = i;

    while(temp % 5 ==0 )

    {

        tot++;

        temp /= 5;

    }

}

2、第二种方法tot = [N / 5] + [N / 5^2] + [N / 5^3]+.....看N除以5得多少,其实就是N!中,能被5整除的因子有多少个,然后每个因子可以贡献一个5,例如26!,[26/5] = 5,就有5,10,15,20,25这五个能被5整除的。然后能被5^2整除的因子可以贡献两个5,例如像25这样的,所以又要再加一次除以5^2的因子的个数,以此类推.....

int tot = 0;

int c = 5;

while(c <= N)

{

    tot += (tot / N);

    c *= 5;

}

 

问题二:

我们知道一个整除除以2可以用右移1位来代替,当一个数可以被2整除的时候,二进制的最低位是0,当最低位是1的时候就是奇数,不能被2整除,所以,我们可以得出一个数可以被2整除多少次,就说明这个数的二进制最低位有多少个0。换一种说法就是这个数2的因子的个数。于是又有:

一个数N的阶乘N!的二进制最低位0的个数 = [N / 2] + [N / 2^2] + [N / 2 ^ 3]+....

 

转载于:https://www.cnblogs.com/xiaxiaosheng/p/4813091.html

你可能感兴趣的文章
android中xml设置Animation动画效果详解
查看>>
SpringMVC详解(五)------参数绑定
查看>>
Redis详解(六)------ RDB 持久化
查看>>
[Effective C++]条款01:视C++为一个语言联邦
查看>>
UIViewController的基本概念与生命周期
查看>>
php 点击按钮自动下载,IE下有问题,求解答!
查看>>
CSU1811: Tree Intersection
查看>>
hibernate 异常:Unexpected Exception caught setting
查看>>
斐波那契求解上楼梯问题
查看>>
Nodejs-log4js使用配置
查看>>
【故障处理】ORA-19809错误处理
查看>>
动态输出的javascript中alert文本的换行问题
查看>>
iOS 开发之环形倒计时进度条(虚线/实线)
查看>>
masonry 设置控件抗压缩及抗拉伸
查看>>
ConfigParser.NoSectionError: No section: 'formatters'原因及解决办法
查看>>
mysql5.7 环境准备
查看>>
第二次作业
查看>>
shell 递归枚举文件并操作
查看>>
python中的函数(基础)
查看>>
228. Summary Ranges
查看>>