编程之美-不要被阶乘吓到

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

       最笨的莫过于对N!直接移位了,然后找到1的位置。

#include<iostream>
using namespace std;

const int N=6;

int Factorial(int N)
 {
   if(N>1)
   {
   return N*Factorial( N-1);

   }
   if(N==1)return 1;

 }
int main()
{
  int data=Factorial(2);
  int loc=0;
  while( !(data&0x0001))
  {
    loc++;
    data>>=1;
  }
cout<< loc;
return 0;

}11

搞了半天阶乘的程序都搞不清了,智商啊!

       书上提供的思路:N=3。N!=2^k*m,m为不含因子2的整数,最低位1的位置=k+1.我们可以这样理解:N!相当于m向左移动的次数,这个次数就是k,因为向左移动就相当于乘法。因此只要计算出从1至N的各个数中因子2 的个数之和。

     代码

int lowwstOne(int N)
{
   int Ret=0;
   while(N)
{
   N>>=1;
   Ret+=N;
}
return Ret;


}

题二:给定一个数,那么N的阶乘N!末尾有多少个0呢?例如 N=10,N!=3628800;,N!的末尾有俩个0;

上代码 :

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

求1,2,...N-1,N中因子5的个数。因为10=2*5,所以0 的个数就是10的个数,但是因子2的个数肯定多余5,故求出5的个数就可以了。


这两道理感觉数学技巧性太多,没什么学习价值,搞技术的应该更多学习技术上的技巧性,而非玩弄数学。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值