Pregunta

Entonces son las 5:00 a.m.donde estoy y estoy confundido y frustrado como el infierno.He creado un programa como este antes pero no puedo entender qué está pasando.

Creé un programa factorial muy simple y verifiqué dos veces la lógica, pero cada vez que ingreso un número mayor que 2, el programa entra en un bucle imprimiendo constantemente "inf".No veo NADA malo en el programa en sí.:(

#include <iostream>

using namespace std;

int main() {
    double userNumber = 0;
    double i = 1;

    cout << "This program will calculate the factorial of the number you enter.\nPlease enter your number now: ";
    cin >> userNumber;

    for ( i = 1; i < userNumber; i++ ) {
        userNumber *= i;
        cout << userNumber;
}

    cout << "\n\nThe factorial is " << userNumber << "." << endl;

    return 0;
}

Funciona para 1 y 2:

enter image description here

Pero tan pronto como hagas 3 o más....

enter image description here

No he creado un programa C++ desde hace tiempo, pero por mi vida no puedo ver qué está mal.¿Es esto sólo un error de sintaxis súper obvio o mi computadora finalmente se está estropeando?

EDITAR:Acabo de cambiar los números de doble a int y esto es lo que obtuve:

enter image description here

Todavía no entiendo por qué hace esto.No veo ningún problema con el bucle for ni con nada más...

Argh. Se estrella la cabeza contra el escritorio

¿Fue útil?

Solución

Cambiar

for ( i = 1; i < userNumber; i++ ) {

a

for ( i = userNumber - 1; i > 1; --i ) {

Tenga en cuenta que su código cambia userNumber en el cuerpo del bucle, de modo que el bucle sólo terminará si userNumber se desborda.

Otros consejos

for ( i = 1; i < userNumber; i++ ) {
        userNumber *= i;
        cout << userNumber;
}

este es el problema :dejar userNumber = 5
yo = 1, userNumber=5
yo = 2, userNumber=10
yo = 3, userNumber=50 ......

y el bucle continúa para siempre.porque cada vez i<userNumber.

Además como consejo general, no compares dobles, utiliza (a-b) < epsilon; donde se requiere precisión elipson.

El problema es que está utilizando una variable tanto como un bucle unido como como un acumulador de ejecución: userNumber aumenta cada vez a través del bucle para que nunca lo alcance. (El expresión i < userNumber no usa el valor userNumber, tenía cuando comenzó a bucle, pero siempre se compara con el valor actual después de cada ronda a través del bucle).

Use una variable separada para el resultado:

int factorial = 1;
for ( i = 1; i < userNumber; i++ ) {
    factorial *= i;

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top