阶乘(Factorial)是个有意思的函数,但是不少人都比较怕它,我们来看看两个与阶乘相关的问题.
1.给定一个整数N,那么N的阶乘N!!末尾有多少个0呢?例如:N=10,N!=3628 800的末尾有两个0...
2.对于N!的二进制表示中最低位1的位置.
解:
问题一的解法一:
第一个问题比较简单我一下就想出来,就是知道N!中有多少个2的,和多少个5乘就可以,并且5的个数一个小于2,所以我写出的算法为:
#include<iostream>
using namespace std;
int main(int argc, char* argv[])
{
int N;
int num=0;
while(cin>>N)
{
while(N)
{
if(N%5 == 0)
num++;
N--;
}
cout<<num<<endl;
num = 0;
}
return 0;
}
其时间复杂度为O(n)而已.
解法二:
这解法也相当经典公式:z = [N/5] + [N/5(2)] + [N/5(3)]+.......(不用担心这会是一个无穷的运算,因为总存在一个K,使得5(k)>N, N/5(k) = 0.)
ret = 0;
while(v)
{
ret+=v/5;
v/=5;
}