不要被阶乘吓倒

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

}        

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值