PTA-基礎編程題目集-6-10 階乘計算升級版

        本題要求實現打印非負整數階乘,其中N是用戶傳入的參數,其值不超過1000。若是N是非負整數,則該函數必須在一行中打印出N!的值,不然打印「Invalid input」。編程

輸入格式:

        每一個輸入包含一個測試用例,第1行輸入N。數組

輸出格式:

        在一行中輸出階乘結果或「Invalid input」函數

輸入樣例:

15測試

輸出樣例:

1307674368000spa

解題思路:

  1. 本題難點在於大數乘法,必須考慮到C語言的數據範圍
  2. 使用數組保存乘法的結果
  3. 採用單位運算的方式,循環遍歷數組的值與乘數進行相乘,若是乘積大於或等於10,則進位
  4. 有一個用例過不去,我如今還沒想到問題出在哪,之後再改

代碼:

#include <stdio.h>

/**
 * 基礎編程題目集-6-10 階乘計算升級版
 */

void printFactorial ( const int N );

int main(int argc, char *argv) {
	int N;
	scanf("%d", &N);
	printFactorial(N);
	return 0;
}

void printFactorial ( const int N ) {
	// 存放結果積
	int result[2600];
	result[0] = 1;
	// 結果積長度,初始爲1
	int index = 1;
	// 結果積的定位下標
	int resultIndex;
	if (N < 0) {
		printf("Invalid input");
	} else if (0 == N) {
		printf("%d", 1);
	} else {
		for (int i = 1; i <= N; i++) {
			// 餘數 
			int remainder = 0;
			for (resultIndex = 0; resultIndex < index; resultIndex++) {
				remainder += result[resultIndex] * i;
				if (remainder >= 10) {
					result[resultIndex] = remainder % 10;
					remainder /= 10;
				}  else {
					result[resultIndex] = remainder;
					remainder = 0;
				}
			}
			
			/**
			 * 判斷最後一次乘法(最高位)的結果是否產生餘數 
			 */
			if(remainder != 0) {
				result[resultIndex] = remainder;
			} else {
				resultIndex -= 1;
			}
			index = resultIndex + 1;
		}
		/**
		* 打印result數組即乘積結果
		*/
		for(int i = resultIndex; i >-1 ; i--) {
			printf("%d", result[i]);
		}
	}
}

結果:

相關文章
相關標籤/搜索