51Nod 1057-N的阶乘

基准时间限制:1 秒 空间限制:131072 KB 分值: 0  难度:基础题
 收藏
 关注
输入N求N的阶乘的准确值。
Input
输入N(1 <= N <= 10000)
Output
输出N的阶乘
Input示例
5
Output示例

120

题解:之前写过一个大数的阶乘问题,但是运行时间太久了,过不去。看了别人写的答案知道了要把结果分成许多段来存,输出的时候要注意一下格式。还有一点我很不明白,希望有人解惑,我定义MOD_的时候用1e8编译通不过,但是用100000000就可以通过编译。

#include<bits/stdc++.h>
using namespace std;
#define MOD_ 100000000
int main()
{
	int n;
	scanf("%d",&n);
	long long int a[10000];
	a[0]=1;
	long long int m,t=0;                        //m为进位,t表示分成几段。
	for(int i=1;i<=n;i++)
	{
		m=0;
		for(int j=0;j<=t;j++)
		{
			a[j]=a[j]*i+m;
			m=a[j]/MOD_;
			a[j]=a[j]%MOD_;
		}
		if(m>0)
		{
			t++;
			a[t]=m;
		}
	}
	printf("%lld",a[t]);
	for(int i=t-1;i>=0;i--)
	{
		printf("%08lld",a[i]);
	}
	return 0;
}
顺便把我的没有过的代码贴上吧。
#include<bits/stdc++.h>
using namespace std;
int main()
{
	int n;
	scanf("%d",&n);
	char a[40000];
	memset(a,0,sizeof(a));
	a[0]=1;
	int sum;
	for(int i=1;i<=n;i++)
	{
		sum=0;
		for(int j=0;j<40000;j++)
		{
			sum=sum+a[j]*i;
			a[j]=sum%10;
			sum=sum/10;
		}
	}
	int k=39999;
	while(a[k]==0)
	{
		k--;
	}
	for(int i=k;i>=0;i--)
	{
		printf("%d",a[i]);
	}
	return 0;
} 


猜你喜欢

转载自blog.csdn.net/qq_40727946/article/details/80144498
今日推荐