Dev - C++ - Ultimo dígito del factorial de un número

 
Vista:
sin imagen de perfil

Ultimo dígito del factorial de un número

Publicado por Chris (7 intervenciones) el 27/09/2021 22:15:24
Buenas a todos, hice el ejercicio de un juez online de calcular el último digito del factorial de un número dado. La primera solución que propuse fué aceptada, para números mayores a 4 devolvía cero, para menores, calculaba el factorial con un bucle y luego devolvía el resto, con módulo 10 sobre el valor.
Se me ocurrió qué, para el último dígito de un factorial sólo hay 5 posibles valores:

1! = 1, último díg 1
2! = 2, último díg 2
3! = 6, último díg 6
4! = 24, último díg 4
si n > 4, último dígito factorial = 0

entonces podía resolverlo con un switch o con if...else para estos 5 casos, quizás así fuese más rápido y obtendría mejor puntuación, pero esta solución fué descartada, y no lo logro entender por qué. He hecho pruebas con ambas soluciones y diferentes entradas y en ambas devuelve lo mismo. No logro ver que está mal o por qué rechaza la solución el juez, está claro que algo no he tenido en cuenta pero no sé dónde más mirar. Dejo aquí el código.

P.D: las entradas siempre son valores positivos.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <iostream>
#include <fstream>
using namespace std;
 
void resuelveCaso() {
    int num;
    cin >> num;
 
    if(num == 1 || num == 2 || num == 4){
        cout << num << endl;
    }
    else if(num == 3){
        cout << 6 << endl;
    }
    else{
        cout << 0 << endl;
    }
}
 
int main() {
    unsigned int numCasos;
    std::cin >> numCasos;
    for (int i = 0; i < numCasos; ++i) {
        resuelveCaso();
    }
 
    return 0;
}

Gracias, un saludo.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Ultimo dígito del factorial de un número

Publicado por anonymous (146 intervenciones) el 27/09/2021 23:36:44
Hola, no será porque no estás tomando en cuenta al número cero? tu estas verificando el 1, 2, 3, 4, ..., n pero no programaste ninguna instrucción que maneje el numero 0, recuerda 0! = 1; No se quisas sea eso, no se me ocurre nada más, suerte, saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Ultimo dígito del factorial de un número

Publicado por Chris (7 intervenciones) el 28/09/2021 00:04:27
Hola Luis, no, no es necesario, las entradas son siempre positivos, así lo especifica el enunciado. De hecho la otra solución que propuse tampoco tenía en cuenta al 0 y fue aceptada. A mi tampoco se me ocurre nada y el juez no da ninguna pista.

Gracias, un saludo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Ultimo dígito del factorial de un número

Publicado por anonymous (146 intervenciones) el 28/09/2021 00:19:10
Ya veo, mmmm entonces quisas sea que al juez no le parezca un código válido al no haber ningún teorema matemático (al menos ninguno que yo conozca) que respalde tu teoría acerca del patrón de los últimos dígitos.

Lo otro que se me ocurre es que desde el punto de vista del juez, tu código no cumpla con los requisitos del enunciado, o algo así, porque no veo que otra cosa puede ser. No se si quieres pasar el enunciado y/o el otro código para ver, quisas hallemos una pista, sino me rindo entonces jajaja.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Ultimo dígito del factorial de un número

Publicado por Chris (7 intervenciones) el 28/09/2021 01:00:43
Es posible, yo tampoco conozco ningún teorema matemático que lo respalde, simplemente pensé que, para valores mayores a cuatro, siempre vas a terminar multiplicando "algo" por 5 y por 2, lo que deja, como mínimo, un cero a la derecha.

Claro, dejo el enunciado, el caso de prueba y el primer código que propuse, el que sí fue aceptado.

ENUNCIADO
Tu primo Luis, de 12 años, está aprendiendo a usar la calculadora. Su profesor le ha dicho que calcule el factorial de varios números. Pero, para evitar que le tengan que copiar números muy largos en el cuaderno, les ha pedido únicamente el último dígito, el de más a la derecha.

Recordando que el factorial es la multiplicación de todos los números entre el número y el uno (por ejemplo, el factorial de 8, escrito 8!, es 8 · 7 · 6 · 5 · 4 · 3 · 2 · 1), demuestra a tu primo Luis que tú eres capaz de hacerlo mucho más rápido que él.

Entrada
El programa recibirá en la primera línea de la entrada el número de casos de prueba. A continuación, cada caso de prueba estará compuesto de una única línea que contendrá un número (positivo).
Salida
Por cada caso de prueba n, se mostrará el último dígito (el de la derecha) de su factorial, n!.

Entrada de ejemplo
3
2
3
4
Salida de ejemplo
2
6
4

Código aceptado
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <fstream>
using namespace std;
 
void resuelveCaso() {
    int resultado, num;
    cin >> num;
 
    if (num > 4){
        resultado = 0;
    }
    else{
        resultado = 1;
        while(num > 1){
            resultado *= num;
            num--;
        }
    }
 
    cout << resultado % 10 << endl;
}
 
int main() {
    unsigned int numCasos;
    std::cin >> numCasos;
    for (int i = 0; i < numCasos; ++i) {
        resuelveCaso();
    }
 
    return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Ultimo dígito del factorial de un número

Publicado por anonymous (146 intervenciones) el 28/09/2021 01:33:50
Mira se que parezco repetitivo pero para mi el problema es el cero. Deja que exponga mi teoría COMPLETA y después decides que hacer.

A) El enunciado dice "línea que contendrá un número (positivo)." Nunca dice que el cero no cuente; Y en muchos casos el cero a pesar de ser un número neutro también es tomado como un número positivo, sobretodo en programación.

B) El enunciado dice "el último dígito (el de la derecha) de su factorial, n!." El factorial n! está definido para los números naturales y para el cero. Yo pienso que el código debe emular al factorial en su totalidad, eso incluye al cero. Y

C) Tu primer código SI maneja al número cero solo que lo hace implícitamente (Haz la prueba e ingresa un 0 para que veas que imprime ​1), sin embargo, ésto NO lo hace el segundo código, y para mí eso es el problema, porque no tiene el 100% del funcionamiento del primero.

En fin tu puedes hacer lo que desees pero deberías hacer la prueba e incluir una sentencia que maneje al cero y presentar tu código a ver que dice el juez, si funciona, bien y sino no pierdes nada.

Avísame cualquier cosa, saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Ultimo dígito del factorial de un número

Publicado por Chris (7 intervenciones) el 28/09/2021 01:57:55
Me parece que vas a tener razón, interpreté mal el caso del cero, en el primer código, si num = 0 entra al else, inicia la variable resultado a 1 y no entra al while, luego 1 % 10 = 1, el cero está includio y no me había dado cuenta!!

Voy a probar con este código, así debería funcionar.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <fstream>
using namespace std;
 
void resuelveCaso() {
    int num;
    cin >> num;
 
    if(num == 0 || num == 1){
        cout << 1 << endl;
    }
    else if(num == 2 || num == 4){
        cout << num << endl;
    }
    else if(num == 3){
        cout << 6 << endl;
    }
    else{
        cout << 0 << endl;
    }
}
 
int main() {
    unsigned int numCasos;
    std::cin >> numCasos;
    for (int i = 0; i < numCasos; ++i) {
        resuelveCaso();
    }
 
    return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Ultimo dígito del factorial de un número

Publicado por Chris (7 intervenciones) el 28/09/2021 02:03:13
Tenías toda la razón!!! Incluido el cero ha aceptado la solución en menos de 15 segundos!! Gracias Luis, muy agudo en tu observación ;) Un saludo!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
sin imagen de perfil

Ultimo dígito del factorial de un número

Publicado por anonymous (146 intervenciones) el 28/09/2021 02:04:16
De nada, que bueno que te sirvió, saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar