6-10 階乘計算升級版(20 分) 本題要求實現一個列印非負整數階乘的函式。
阿新 • • 發佈:2019-02-11
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位開始新的一輪計算。