微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

阶乘的精确值借鉴白书

输入不超过1000的正整数n,输出n的阶乘的精确结果

样例输入:30

样例输出:265252859812191058636308480000000

分析:

为了保存结果,需要分析1000!有多大。用计算器算一算不难知道,1000!约等于4*10^2567,因此可以用一个3000个元素的数组f保存。为方便起见,让f【0】保存个位,f【1】保存十位等等,,,(方便向后进位);然后逆序除零输出即可

 

白书代码

#include<stdio.h>
#include<string.h>
const int maxn = 3000;
int f[maxn];
int main()
{
	int i,j,n;
	scanf("%d",&n);
	memset(f,sizeof(f));
	f[0]=1;
	for(i=2;i<=n;i++)
	{
        int c=0;
        for(j=0;j<maxn;j++)
        {  
			int s=f[j]*i+c;
			f[j]=s%10;
			c=s/10;
        }
	}
	for(j=maxn-1;j>=0;j--) if(f[j]) break;
	for(i=j;i>=0;i--) printf("%d",f[i]);
	printf("\n");
	return 0;
}

 

自己代码

#include <stdio.h>
#include <string.h>
#define max 3000

int a[max];
//author:YangSir
int main()
{
	int len,n,i,s,c;
	while(~scanf("%d",&n))
	{
		memset(a,sizeof(a));
		a[0]=1;
		len=1;//表示位数
		for(i=2;i<=n;i++)
		{
			c=0;//表示进位的数值
			for(j=0;j<len;j++)
			{
				s=a[j]*i+c;
				c=s/10;
				a[j]=s%10;
			}
			while(c)
			{
				a[j++]=c%10;
				c/=10;
				len++;
			}
		}
		for(i=len-1;i>=0;i--)
			printf("%d",a[i]);
		printf("\n");
	}
	return 0;
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐