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

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

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

[cpp]
view plain
copy
print
?

  1. #include<iostream>  
  2. using namespace std;  
  3.   
  4. const int N=6;  
  5.   
  6. int Factorial(int N)  
  7.  {  
  8.    if(N>1)  
  9.    {  
  10.    return N*Factorial( N-1);  
  11.   
  12.    }  
  13.    if(N==1)return 1;  
  14.   
  15.  }  
  16. int main()  
  17. {  
  18.   int data=Factorial(2);  
  19.   int loc=0;  
  20.   while( !(data&0x0001))  
  21.   {  
  22.     loc++;  
  23.     data>>=1;  
  24.   }  
  25. cout<< loc;  
  26. return 0;  
  27.   
  28. }11  

[cpp]
view plain
copy
print
?

  1.   

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

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

     代码

[cpp]
view plain
copy
print
?

  1. int lowwstOne(int N)  
  2. {  
  3.    int Ret=0;  
  4.    while(N)  
  5. {  
  6.    N>>=1;  
  7.    Ret+=N;  
  8. }  
  9. return Ret;  
  10.   
  11.   
  12. }  

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

上代码 :

[cpp]
view plain
copy
print
?

  1. ret=0;  
  2. for(i=1;i<=N;i++)  
  3. {  
  4.   j=i;  
  5.   while(j%5==0)  
  6.   {  
  7.     
  8.    ret++;  
  9.    j/=5;  
  10.   }  
  11. }  

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

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

    原文作者:xdtongyuan
    原文地址: https://blog.csdn.net/cike211/article/details/9990217
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞