首先看一個簡單的使用遞迴演算法的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;}}}