51nod 1057 N的阶乘

本文介绍了一个高效解决大数阶乘问题的方法,通过分组相乘避免了传统算法的超时问题,特别适用于如10000这样的大数值阶乘计算。

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


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


当n=10000时,一个一个的乘会超时,就两个两个就乘。。。。


代码:

#include<cstdio>
int main()
{
	int n;
	scanf("%d",&n); 
	int ss[250000],geshu,yu,yuan;
    geshu=1;ss[0]=1;
    if (n%2)
	{
		for (int i=2;i<n;i+=2)
	    {
	    	yu=0,yuan=geshu;
			for (int j=0;j<geshu;j++)
			{
				if (j<yuan)
				ss[j]=ss[j]*i*(i+1)+yu;
				else
				ss[j]=yu;
				if (ss[j]>9)
				{
					yu=ss[j]/10;
					ss[j]%=10;
					if (j==geshu-1)
					geshu++;
				}
				else
				yu=0;
			}
		}
	}
	else
	{
		if (n>=2)
		ss[0]=2; 
		for (int i=3;i<n;i+=2)
	    {
	    	yu=0,yuan=geshu;
			for (int j=0;j<geshu;j++)
			{
				if (j<yuan)
				ss[j]=ss[j]*i*(i+1)+yu;
				else
				ss[j]=yu;
				if (ss[j]>9)
				{
					yu=ss[j]/10;
					ss[j]%=10;
					if (j==geshu-1)
					geshu++;
				}
				else
				yu=0;
			}
		}
	}
	for (int i=geshu-1;i>=0;i--)	
	printf("%d",ss[i]);
	printf("\n");
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值