簡體   English   中英

C ++階乘程序為任何大於2的數提供無窮大

[英]C++ factorial program give infinity for any number greater than 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 ++程序了,但是我一生都看不出有什么問題。 這僅僅是一個非常明顯的語法錯誤,還是我的計算機最終崩潰了?

編輯:我只是將數字從雙精度更改為整數,這就是我得到的:

在此處輸入圖片說明

我仍然不明白為什么要這么做。 我看不到for循環或其他任何問題...

哎呀。 撞到桌子上

更改

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
i = 1, userNumber = 5
i = 2, userNumber = 10
i = 3, userNumber = 50 ......

循環永遠持續。 因為每次i<userNumber

同樣作為一般建議,不要比較雙精度,請使用(ab) < epsilon; 要求elipson精確的地方。

問題是您將一個變量既用作循環邊界,又用作運行的累加器-每次循環時userNumber增加,因此您將永遠無法使用它。
(表達式i < userNumber不使用您開始循環時使用的userNumber值,但始終在循環執行后與當前值進行比較。)

對結果使用單獨的變量:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM