C ++ факториальная программа дает бесконечность для любого числа больше 2

Итак, сейчас 5:00 утра. где я, и я в замешательстве и разочарование, как ад. Я создал такую ​​программу раньше, но не могу понять, что происходит.

Я создал очень простую факториальную программу и дважды проверил логику, но каждый раз, когда я ввожу число больше 2, программа зацикливается, постоянно печатая «inf». Я не вижу ничего плохого в самой программе. 🙁

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

Работает на 1 и 2:

введите описание изображения здесь

Но как только вы сделаете 3 или больше ….

введите описание изображения здесь

Я давно не создавал программы на C ++, но не могу понять, в чем дело. Это просто супер очевидная синтаксическая ошибка, или мой компьютер окончательно сломался?

РЕДАКТИРОВАТЬ: я просто изменил числа с двойного на int, и это то, что я получил:

введите описание изображения здесь

Я до сих пор не понимаю, почему он это делает. Я не вижу проблемы с циклом for или чем-то еще …

Argh. Разбивает голову в стол

0

Решение

+ Изменить

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

в

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

Обратите внимание, что ваш код меняется userNumber в теле цикла, так что цикл будет прерван только если userNumber переполняется.

4

Другие решения

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

это проблема: пусть userNumber = 5
я = 1, userNumber= 5
я = 2, userNumber= 10
я = 3, userNumber= 50 ……

и цикл продолжается вечно. потому что каждый раз i<userNumber,

Также как общий совет, не сравнивайте двойники, используйте (a-b) < epsilon; где elipson требуется точность.

0

Проблема в том, что вы используете одну переменную как в виде цикла, так и в качестве накопителя — userNumber увеличивается каждый раз через цикл, так что вы никогда не достигнете его.
(Выражение i < userNumber не использует значение userNumber имел, когда вы начали цикл, но всегда сравнивается с текущим значением после каждого цикла в цикле.)

Используйте отдельную переменную для результата:

int factorial = 1;
for ( i = 1; i < userNumber; i++ ) {
factorial *= i;
0
По вопросам рекламы [email protected]