用陣列解決數值大的數的階乘!!
阿新 • • 發佈:2018-12-07
起初這是C++老師,佈置的道題,做了3天 也沒做出來,最後還是聽別人的意見改的,原因是自己的想法太複雜了 ,而且 乘法還是沒學好,沒用過這樣的乘法,也不知道,
自己太菜雞了!!!
廢話不多說了,開始吧
題目:解決高位數的階乘問題,例如50的階乘
分析:無論是用int 還是long long 最終結果還是會越界,導致輸出異常。;
直接丟程式碼
#include <cstdio> #include <algorithm> #include <iostream> #include <cstdlib> #include <time.h> #include <string.h> #include <cmath> using namespace std; int a[1001]; int solo(int a[]) { int j; for(int i=1000;i>=0;i--) { if(a[i]!=0) { j=1000-i+1; break; } } return j; } int main() { memset(a,0,sizeof(a)); int n; a[0]=1; cin>>n; if(n==0) { cout<<1<<endl; return 0; } if(n==1) { cout<<1<<endl; return 0; } for(int i=2; i<=n; i++) { int sum=0; int Q=0; int zz=solo(a); while(1) { int z=i*a[Q]+sum; int t=0; if(z>=10) { a[Q]=z%10; sum=z/10; } else { a[Q]=z; sum=0; } Q++; if(Q>=zz&&t==0) break; } } int zzz; for(int i=1000;i>=0;i--) { if(a[i]!=0) { zzz=i; break; } } for(int i=zzz;i>=0;i--) cout<<a[i]; }
忘記在程式碼上加註釋了!! 唉 壞毛病
呼叫的solo函式:
舉例:
在10的階乘裡面,算11的階乘的時候,10的階乘是個很大的數,最裡層的那個while迴圈 需要確定一下迴圈幾次,solo函式就是確定次數的,他通過讀取已有的a陣列中元素最後一位的座標,來確定到底佔用了多少個數組記憶體了,從而確定 i 值乘多少遍。
其餘的沒什麼好解釋的了 垃圾演算法 歡迎交流Q:690217293