¡El factorial de n (a 10000) no excede el límite de tiempo!

¡NORTE!

Dado un número entero N (0 ≤ N ≤ 10000), ¡su tarea es calcular N!

Entrar

Se procesa una línea de N hasta el final del archivo.

Exportar

¡Para cada N, salida N! En una línea.

Entrada de muestra

1
2
3

Salida de muestra

1
2
6

Idea: por lo general, resuelva el problema de los datos aritméticos de gran número fuera de rango utilizando matrices para simular

Para el factorial de números grandes, lo más importante es cómo almacenar cada dígito de cada número y el elemento de matriz correspondiente.

Código de implementación:

#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;
}

El siguiente código es similar pero con Runtime Error como comparación:

#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;
}

Referencia del código de CA: https://blog.csdn.net/hnuzengchao/article/details/7287599

Supongo que te gusta

Origin blog.csdn.net/with_wine/article/details/113933441
Recomendado
Clasificación