Итак, сейчас 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. Разбивает голову в стол
+ Изменить
for ( i = 1; i < userNumber; i++ ) {
в
for ( i = userNumber - 1; i > 1; --i ) {
Обратите внимание, что ваш код меняется userNumber
в теле цикла, так что цикл будет прерван только если userNumber
переполняется.
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 требуется точность.
Проблема в том, что вы используете одну переменную как в виде цикла, так и в качестве накопителя — userNumber
увеличивается каждый раз через цикл, так что вы никогда не достигнете его.
(Выражение i < userNumber
не использует значение userNumber
имел, когда вы начали цикл, но всегда сравнивается с текущим значением после каждого цикла в цикле.)
Используйте отдельную переменную для результата:
int factorial = 1;
for ( i = 1; i < userNumber; i++ ) {
factorial *= i;