1. 程式人生 > >計算大數階乘

計算大數階乘

#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。

                    ————我是太陽騎士索拉爾,願太陽在你心中閃耀