1. 程式人生 > >6-10 階乘計算升級版(20 分) 本題要求實現一個列印非負整數階乘的函式。

6-10 階乘計算升級版(20 分) 本題要求實現一個列印非負整數階乘的函式。

https://pintia.cn/problem-sets/14/problems/742

#include <stdio.h>

void Print_Factorial ( const int N );

int main()
{
    int N;
	
    scanf("%d", &N);
    Print_Factorial(N);
    return 0;
}
void Print_Factorial(int N){
	int a[3000];
	int temp,num,digit;           //temp:每一位的結果  num:進位   digit:結果的位數
	int i,j;
	a[0]=1;
	digit=1;                      //從第1位開始 
	if(N>=0) {
		for(i=2;i<=N;i++){
	    	num=0;
			for(j=0;j<digit;j++){
			  temp=a[j]*i+num;    
			  a[j]=temp%10;       //把當前位的數字存入數字 
			  num=temp/10;        //向前面一位進位 
		    } 
		    while(num){           //當i的階乘算完,任有進位,則陣列需擴大 
		    	a[digit]=num%10;
		    	num/=10;
		    	digit++;
			}
		}
		for(i=digit-1;i>=0;i--){
			printf("%d",a[i]);
		}
	}
	else printf("Invalid input");
} 

這個題目就是大數相乘,用陣列儲存的一個題目:

核心思想就是:對於0到N,變數i是需要與陣列的每一位都要相乘的,而且從低位開始相乘。

                        對於陣列中的每一位,它所儲存的數是:(與i相乘+進位)%10。

   此外要注意:

                       當你在計算的過程中,肯定要時時刻刻都清楚當前的陣列真實的長度吧,所以在這裡引進了變數digit,當陣列的最高位有進位時,就要根據進位去擴大陣列了去儲存了。

                       當每一次乘以i時,變數num都需要重新賦值為0,因為相當於又從最低位0位開始新的一輪計算。