¿Hay algún método para generar números factoriales grandes usando C ++?

Si desea obtener tanto precisión arbitraria como código rápido, debe usar una biblioteca especializada que proporcione aritmética de precisión arbitraria en enteros, por ejemplo: GMP.

La biblioteca GNU MP Bignum
Interfaz C ++ General – GNU MP 6.0.0

Aquí hay una buena respuesta de StackOverflow que proporciona el código C ++ / GMP para calcular factoriales grandes: http://stackoverflow.com/a/27319…

#include
#include

hecho de mpz_class (unsigned int n)
{
resultado mpz_class (n); // inicializa un número entero de tamaño arbitrario con ‘n’
mientras que (n–> 1) resultado * = n; // calcula el producto con todos los enteros <n
resultado de retorno;
}

int main ()
{
sin signo n = 100000;
mpz_class result = fact (n);
std :: cout << resultado << std :: endl;
}

Puede compilar este código con: g++ -Wall -Wextra Page on fact.cc -lgmpxx -lgmp
Tenga en cuenta que debe tener libgmp instalado en su sistema para compilar este programa.

Si implementa su propio algoritmo de multiplicación, el rendimiento será terriblemente lento en comparación con el muy bien optimizado código GMP (u otra biblioteca de precisión arbitraria). Porque usan algoritmos de última generación + toneladas de optimizaciones + código ASM integrado para aprovechar al máximo su hardware.

También puede usar el paquete de multiprecisión Boost para este propósito:
http://www.boost.org/doc/libs/1_…

Puede usar una matriz de int para almacenar ese valor e ir con el método habitual de multiplicación del número anterior en papel de lápiz. Digamos por ej. El hecho (100) es de 100 dígitos y lo almaceno en una matriz de enteros, entonces para calcular el hecho (101) solo tengo que multiplicar 101 con la matriz almacenada anterior, y esto se puede hacer mediante el método habitual de multiplicación de papel de lápiz. que multiplicamos el número 101 con cada dígito y el carry se lleva adelante y se agrega, y se actualiza la matriz al valor de hecho (101). Para referencia, le doy el código del problema SPOJ.com – Problema FCTRL2
Aquí tomé una matriz de tamaño 200 e implementé lo que se ha dicho anteriormente.

#include
#include
int main ()
{
int t, n, z, a [200], m, i, x, temp;
scanf (“% d”, & t);
mientras que (t> 0)
{scanf (“% d”, & n);
a [0] = 1; m = 1; i = 1;
mientras (i <= n)
{temp = 0; z = 0;
para (; z {x = a [z] * i + temp;
a [z] = x% 10;
temp = x / 10;
}
while (temp! = 0)
{a [z ++] = temp% 10;
temp / = 10;
m ++;
}
i ++;
}
para (i = –m; i> = 0; i–)
printf (“% d”, a [i]);
t–;
printf (“\ n”);
}
devuelve 0;
}

Como factorial grande implica bits grandes, no puede almacenarlos en int o long int.

Ahora piense en matrices, suponga que desea almacenar un número de 40 dígitos y está almacenando cada dígito de número en un índice de matriz.
por ejemplo: 4567 como {0,0,0,0,0,0,0 ……., 4,5,6,7}

Ahora piense que tiene un número de esta matriz y desea multiplicar este número con un número entero. ¿Cómo lo hará?

¿Recuerdas las primeras matemáticas estándar?
donde primero multiplicamos el número con el último dígito y luego llevamos adelante al siguiente dígito y multiplicamos con el segundo último dígito y agregamos acarreo.

Espero que entiendas mi punto.

Programa factorial en C ++

El factorial de cualquier número es el producto de un número entero y todos los enteros debajo de él, por ejemplo, el factorial de 4 es

4! = 4 * 3 * 2 * 1 = 24. El programa factorial en c ++ de cualquier número es un diseño simple

A menos que necesite el número real, también puede calcular su logaritmo. Eso implica sumar los logaritmos de los números en lugar de multiplicar los números juntos, y te llevará lejos.

Una forma de resolver el problema es almacenar los dígitos del número en la matriz y seguir multiplicándolos.

#include
int main () {
int t;
int a [200]; // array tendrá la capacidad de almacenar 200 dígitos.
int n, i, j, temp, m, x;
scanf (“% d”, & t);
mientras que (t–) {
scanf (“% d”, & n);
a [0] = 1; // inicializa la matriz con solo 1 dígito, el dígito 1.
m = 1; // inicializa el contador de dígitos
temp = 0; // Inicializa la variable carry a 0.
para (i = 1; i <= n; i ++) {
para (j = 0; j x = a [j] * i + temp; // x contiene el producto dígito por dígito
a [j] = x% 10; // Contiene el dígito para almacenar en la posición j
temp = x / 10; // Contiene el valor de acarreo que se almacenará en índices posteriores
}
while (temp> 0) // while loop que almacenará el valor de acarreo en la matriz. {
a [m] = temp% 10;
temp = temp / 10;
m ++; // incrementa el contador de dígitos
}
}
para (i = m-1; i> = 0; i–) // respuesta de impresión
printf (“% d”, a [i]); printf (“\ n”);
}
devuelve 0;
}

Consulte este enlace para obtener una explicación detallada de los factores de computación de un gran número en C / C ++: un tutorial

More Interesting

¿Por qué los programas de posgrado estadounidenses en matemáticas, estadística y CS están dominados por estudiantes internacionales?

¿Qué son los códigos ponderados y no ponderados?

¿Qué temas en matemáticas debo aprender para la programación competitiva?

¿Qué tipos de matemáticas son las más destacadas en informática?

¿Cómo se puede construir un nuevo generador de números pseudoaleatorios criptográficamente útil?

¿Cuál es el concepto de tipos en la teoría de tipos (de una manera simple pero rigurosa)?

¿Por qué algunas funciones hash usan un número primo como base? ¿Cuál es el significado de usar un número primo? ¿Es para asignar unicidad y minimizar la colisión de valores hash?

¿Qué son los circuitos Garbling en términos simples? ¿O suponiendo solo conocimientos básicos de cómputo multiparte?

¿Cuál es el polinomio más pequeño que puede atravesar todos los conjuntos de n puntos? ¿Hay uno?

¿Qué es la teoría de Ramsey y cómo se relaciona con la informática?

Dado que la programación va a ser cada vez más abstracta, ¿necesitamos estudiar más matemáticas para ser buenos en eso?

¿Cuál es el tipo de datos de optimización de memoria más apropiado en Matlab para importar un archivo de audio que tiene un valor máximo de 0.495971679687500 y el valor mínimo es -0.488983154296875?

¿Se consideran [matemáticas] \ matemáticas O (n ^ {\ log n}) [/ matemáticas] y [matemáticas] \ matemáticas O (n ^ {1+ \ log n}) [/ matemáticas] las mismas clases de complejidad?

¿Las matemáticas son muy difíciles en un programa BCA?

¿Qué pasaría si se definiera la multiplicación para tener 0 como identidad en lugar de 1?