n的阶乘(到10000)不时间超限!

N!

‎给定整数 N (0 ≤ N ≤ 10000),您的任务是计算 N!‎

‎输入‎

‎一条 N 在一行中,处理到文件的末尾。‎

输出‎

‎对于每个N,输出N!在一行。‎

Sample Input

1
2
3

Sample Output

1
2
6

思路:通常解决大数运算数据超出范围的问题时采用数组去模拟

对于大数阶乘来说,最重要的是如何将每个数的每位数与相对应的数组元素储存起来

实现代码:

#include<stdio.h>
#include<string.h>
using namespace std;
int main()
{
	int i,j,n,l,num,t;
	while(~scanf("%d",&n))
	{
		int s[8000]={1};
		l=1;/*l用来记录该数的长度*/
		for(i=2;i<=n;i++)
		{
			num=0;
			for(j=0;j<l;j++)
			{
				t=s[j]*i+num;
				num=t/100000;
				s[j]=t%100000;/*为了防止时间超限*/
			}
			while(num!=0)
			{
				s[l++]=num%100000;/*如果进位,数组运算实际长度加一*/
				num=num/100000;
			}
		}
		/*这里的输出注意*/
		j=l-1;
		printf("%d",s[j--]);
		for(;j>=0;j--)
		{
			printf("%05d",s[j]);
		}
		printf("\n");
	}
	return 0;
}

下面给出差不多但运行时间错误(Runtime Error)的代码作为对比:

#include<stdio.h>
#include<string.h>
int main()
{
	int n;
	while(scanf("%d",&n),n>=0)
	{
		int a[20010];/*储存每一位所得到的的数*/
		int i,j;
		int temp,dight=1;/*temp储存每次得到的数,dight每次得到的数的位数*/
		a[0]=1;
		 
		for(i=2;i<=n;i++)
		{ 
			int num=0;/*储存进位数*/ 
			for(j=0;j<dight;j++)/*每一位的数都分别乘以i*/
			{
				temp=a[j]*i+num;/*temp储存每次得到的数*/
				a[j]=temp%10;
				num=temp/10;
			}
			while(num)
			{
				a[dight]=num%10;
				num=num/10;
				dight++;
			}
		}
		for(i=dight-1;i>=0;i--)
		{
			printf("%d",a[i]);
		}
		printf("\n");
	}
	return 0;
}

AC代码参考:https://blog.csdn.net/hnuzengchao/article/details/7287599

猜你喜欢

转载自blog.csdn.net/with_wine/article/details/113933441
今日推荐