編程之美-不要被階乘嚇到

來源:互聯網
上載者:User

求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的個數就可以了。

這兩道理感覺數學技巧性太多,沒什麼學習價值,搞技術的應該更多學習技術上的技巧性,而非玩弄數學。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.