阶乘(草稿未完成)

来源:互联网 发布:小米手机刷机救砖软件 编辑:程序博客网 时间:2024/05/06 14:23

1.计算阶乘

大多数教科书式的代码,但是教科书式的代码并不是效率最优的.

int factorial1(int n){if (n == 1 || n == 0)return 1;return n*factorial1(n-1);}int factorial2(int n){int i,res=1;for(i=1;i<=n;++i)res *=i;return res;}

2. 计算阶乘末尾第一个非0数字


3.阶乘末尾有多少个0

题目来自于<编程之美>的<不要被阶乘吓倒>

思路:哪些数相乘能得到10呢?显然是2*5才能得到10,对N!进行质因数分解,N!=(2^x)*(3^y)*(5^z).........,所以0的个数只与x和z有关,每一对2,5就能组成一个末位0.因为2的质因数比5的质因数要多,所以,只需要算出z的个数即可(即只需要算出5的质因数个数).

解法一:要计算z,最直接的方法就是蛮力计算i(i=1,2,3....N)的因式分解中5的指数,然后求和.

ret = 0;for(i=1; i<=N; ++i){j=i;while(j % 5 == 0){++ret;j /= 5;}}

解法二:利用公式:z=[N/5]+[N/5^2]+[N/5^3]+.....(指数函数最终无穷趋向于x轴)(公式不好记,后面说一下递归的思路)

公式中,[N/5]表示不大于N的数中5的倍数贡献一个5,[N/5^2]表示不大于N的数中5^2再贡献一个5,.....


4.返回阶乘左边的第二个数字
5. 判断数值 m 是否可以整除 n!
6.数字N能否表示成若干个不相同的阶乘的和:

参考资料:

http://developer.51cto.com/art/201104/254914.htm

http://blog.csdn.net/xiaofengsheng/article/details/4834628

《编程之美》