1. 程式人生 > >PTA_基礎程式設計題目集_6-10 階乘計算升級版 (20 分)“大數階乘”

PTA_基礎程式設計題目集_6-10 階乘計算升級版 (20 分)“大數階乘”

1.預估1000!的位數~~進行放大估計~~1000^900&100^100即是3*900+2*100+o<3000位

2.這裡顯然需要利用陣列來儲存數字並進行運算,讓陣列成員每個儲存3位數字(題目條件已告知引數小於1000),我們構建1200個成員的陣列(3600位);

3.難點在於我們對陣列成員間相乘、進位的考慮,這裡容易誤入歧途;這裡本質上來講,與就是把十進位制轉化為千進位制,而轉化為千進位制的一個重要原因在於我們將多位數*多位數的複雜情況轉化為了單位數*多位數的簡單情況進行運算,具體細節見下面程式碼。

  • 我的程式碼
void Print_Factorial(const int N)
{
        int n = N;
	if (n < 0)
		printf("%s", "Invalid input");
	if (n == 0 || n == 1) 
		printf("%d", 1);

	/*
	數字運算時:
	該演算法通過陣列控制,使得每次都進行 同位數*同位數 (可以小,不能大)運算,
	且將 大數乘法 -> 個位*多位。

	同位數*同位數=本位數+進位數:
	(在 個位*多位 的情況下)
        進位數+進階本位數 < 進位值(一個簡單的乘法規律)

	從而不產生多次相加的連續進位問題
	*/

	if (n > 1)
	{
		int a[1200] = { 1,0 }, len = 1;//一個數組,一個位數指標len	

		for (int c, j; n > 1; n--)//這裡的進階c設計的非常巧妙
		{
			for (j = 0, c = 0; j < len; j++)//通過j讓多位的每位被乘
			{
				int p = a[j] * n + c;
				a[j] = p % 1000;
				c = p / 1000;
			}
			c > 0 ? a[j] = c, len++ : 0;//一次單位*多位的最後一次c的運算
		}

		printf("%d", a[len - 1]);//注意列印格式的規範化
		for (int m = len - 2; m >= 0; m--) 
			printf("%03d", a[m]);
	}
}