51Nod 1057-N的阶乘

本文介绍了一种解决大数阶乘问题的方法,通过将结果分段存储并注意输出格式,成功解决了因数值过大导致的问题。同时对比了两种不同的实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

基准时间限制: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;
} 


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值