不要被阶乘吓倒

来源:互联网 发布:淘宝升级怎么升级 编辑:程序博客网 时间:2024/05/16 18:10

       阶乘(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;

}        

原创粉丝点击