1. 程式人生 > >[ACM] hdoj1042 N! 解題報告

[ACM] hdoj1042 N! 解題報告

題目傳送門

題目大意

計算n!,其中n的取值範圍為0 <= n <= 10000。

解題思路

10000!結果的位數可以通多hdoj1018計算出來,其結果為35660位,因此,本題為大數乘法運算。

可採用模擬手算的方法計算該題目。

解題程式碼

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main()
{
	int i, j;
	int n;
	int len;
	int num[36000];    // 儲存計算結果的陣列
	
	while(scanf("%d", &n) != EOF)
	{
		memset(num, 0, sizeof(num));
		num[0] = 1;
		num[1] = 1;
		for(i = 2; i <= n; i++)
		{
			len = num[0];
			for(j = 1; j <= len; j++)
			{
				num[j] *= i;               //每一位乘以i
			}
			for(j = 1; j <= num[0]; j++)
			{
				if(num[j] > 9)             //進位
				{
					num[j + 1] += num[j] / 10;
					num[j] = num[j] % 10;	
				}
				if(num[num[0] + 1] != 0)   //乘積位數擴充套件
				{
					num[0] += 1;
				}
			}
		}
		for(i = num[0]; i > 0; i--)
		{
			printf("%c", num[i] + '0');
		}		
		printf("\n");
	}	
	return 0;
}

/****************************
*@problemID :1042
*@language  :C++
*@Exe.Time  :2652ms
*@Exe.Memory:1748k
*@Code.Len  :659B
*****************************/

注意

1.乘積在陣列中儲存的為逆序,即個位在最前面,輸出時需要逆序。