C ++阶乘程序为任何大于2的数字提供无穷大

时间:2014-04-14 10:20:00

标签: c++ factorial infinity

所以它是凌晨5点。我在哪里,我很困惑和沮丧。我以前创建了这样的程序,但无法理解发生了什么。

我创建了一个非常简单的阶乘程序,并对逻辑进行了双重检查,但每次输入一个大于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:

enter image description here

但是只要你做3或更高......

enter image description here

我暂时还没有创建一个C ++程序,但是对于我的生活来说,看不出有什么问题。这只是一个非常明显的语法错误,还是我的计算机最终打破了我?

编辑:我刚刚将数字从double更改为int,这就是我得到的:

enter image description here

我仍然不明白为什么会这样做。我没有看到for循环或其他任何问题...

哎呀。 Smashes走进办公桌

3 个答案:

答案 0 :(得分:4)

更改

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

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

请注意,您的代码会在循环体中更改userNumber,因此只有在userNumber溢出时,循环才会终止。

答案 1 :(得分:0)

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

这是问题:让userNumber = 5
i = 1,userNumber = 5
i = 2,userNumber = 10
i = 3,userNumber = 50 ......

并且循环继续。因为每次i<userNumber

同样作为一般建议,不要比较双打,使用(a-b) < epsilon;,其中elipson是精确的。

答案 2 :(得分:0)

问题在于你使用一个变量作为循环限制和运行累加器 - userNumber每次循环都会增加,所以你永远不会到达它。
(表达式i < userNumber不使用开始循环时的值userNumber,但总是在循环的每一轮之后与当前值进行比较。)

为结果使用单独的变量:

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