大數階乘問題的c++實現

來源:互聯網
上載者:User

首先看一個簡單的使用遞迴演算法的n!程式:

#include<iostream>using namespace std;long fac(int);int main(){  int n;  cout<<"請輸入數字n,將輸出n!:"<<endl;  cin>>n;  long y=fac(n);  cout<<y<<endl;  return 0;}long fac(int n){long f;if(n<0){cout<<"errro,請輸入正數!!"<<endl;return -1; }else if(n==0)    return 1;else if(n==1) return 1;f=n*fac(n-1);return f;}

顯然,這個程式中的n是有上限的,當long佔8位元組的時候,f的取值範圍是-9223372036854775808~9223372036854775807;

所以諸如計算1000!的值是不可以用上述程式求解的。

當然,

由於位元的限制,沒有任何程式設計語言,可以儲存例如1000!這個乘法結果的量。解決的方法是採用數組來儲存。

首先令數組的最後一位的數值為1,位元為1,然後將每次相乘的乘積存回數組,並迴圈處理每個數組中超過10的數,若數值超過10,則需要進位,將位元加1,原來的數除以10,商數加前一位元的數值後存回前一位元的數組中,再將餘數存回原來位元的數組中。

#include<iostream>using namespace std;int main(){int array_num[3000];// 合適大小即可int total,rem=0,count,ix;//rem 用來儲存餘數    for(ix=0;ix<3000;ix++)array_num[ix]=0;ix=2999;array_num[2999]=1;for(count=2;count<=100;count++){  while(ix>0)   {      total=array_num[ix]*count+rem;      rem=0;if(total>9) {  array_num[ix]=total%10;  rem=total/10; }else array_num[ix]=total;      ix--;   }rem=0;total=0;ix=2999;}for(ix=0;ix<3000;ix++)            {if(array_num[ix]!=0 | count==1){  cout<<array_num[ix];  count=1;}}}

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.