計算大數階乘
阿新 • • 發佈:2019-02-01
#include<stdio.h> #include<string.h> int main (void) { int N,sub,sub_a; int m,i,j,k,p; int res[500],a[500],b[500]; scanf ("%d",&N); memset(res,0,sizeof(res));//儲存結果 res[499]=1;//將輸出結果先賦值為1 while (N) { memset(a,0,sizeof(a));//a是負責將階乘中新的數放進去 memset(b,0,sizeof(b));//b是得出a和res得結果 m=N; i=499; //將m拆開 放入a陣列 while (m) { a[i]=m%10; m=m/10; i--; } //sub為res最高位 for (i=0;i<500;i++) { if (res[i]!=0) { sub=i; break; } } //sub_a為a得最高位 for (i=0;i<500;i++) { if (a[i]!=0) { sub_a=i; break; } } p=499; k=499; //將a與res的乘積放入b for (i=499;i>=sub_a;i--) { for (j=499;j>=sub;j--) { b[k--]+=(a[i]*res[j])%10; b[k]+=(a[i]*res[j])/10; } p--; k=p; } //b覆蓋res for (i=0;i<500;i++) { res[i]=b[i]; } N--; } //找到最後的res最高位 for (i=0;i<500;i++) { if (res[i]!=0) { sub=i; break; } } //輸出 for (i=sub;i<500;i++) { printf ("%d",res[i]); } }
我將陣列開到500,把所有位放0,將每個數拆分從右至做依次放入(還是按原順序0)
關鍵程式碼為如何計算二者成績,就是將兩個多位數相乘按照豎式去計算,但計算時並不是滿十進一,而是隻取最低位個位放在位置上,其他高位全部進位到上一位,這樣可以在兩層迴圈時就搞定。
比如說我們計算111*11
正常豎式為:
11
* 111
------------
11
11
11
------------
1221
我們的計算方法為:
11
* 111
------------
1221
emmm,反正就是直接得111只保留個位1,下一個算出來是111加上前面進位得11就是1221。
————我是太陽騎士索拉爾,願太陽在你心中閃耀