HDOJ-1042 N!(大数乘法)

http://acm.hdu.edu.cn/showproblem.php?pid=1042

 

题意清晰..简单明了开门见山的大数乘法..

10000的阶乘有35000多位 数组有36000够了

# include <stdio.h>

# include <string.h>

# define MAX 36000



int BigNum[MAX], NowLen;



void Multi(int number)

{

	int Temp[MAX]={0}, Tlen = 0, t;//Temp保存乘后结果

	

	while(number > 0)

	{

		t = number % 10;//依次取当前乘数的低位

		number /= 10;



		for(int i = 0, j = Tlen; i <= NowLen; i++)//模拟乘法 先不管进位

		{

			Temp[j++] += BigNum[i] * t;

		}

		Tlen++;//每乘完一位 Temp的开始读入位置+1

	}

	

	for(int i = 0; i < MAX; i++)//处理进位 接收结果

	{

		if(Temp[i] > 9)

		{

			Temp[i + 1] += Temp[i] / 10;

			BigNum[i] = Temp[i] % 10;

		}

		else BigNum[i] = Temp[i];

	}

	for(int i = MAX - 1; i >= 0; i--)//获取长度

	{

		if(BigNum[i] > 0)

		{

			NowLen = i;

			break;

		}

	}

}



int main()

{

	int n;

	while(scanf("%d",&n) != EOF)

	{

		memset(BigNum, 0, sizeof(BigNum));

		BigNum[0] = 1, NowLen = 0;//初值 初始长度

		for(int i = 2; i <= n; i++)//模拟乘法

			Multi(i);



		for(int i = NowLen; i >= 0; i--)//格式输出

			printf("%d",BigNum[i]);

		printf("\n");

	}



	return 0;

}

  

你可能感兴趣的:(OJ)