簡體   English   中英

為什么我的 c++ 斐波那契序列代碼在 46 次迭代后給出負值

[英]Why does my c++ fibonacci sequence code give negative values after 46 iterations

每當我嘗試從 for 循環中取出前兩次迭代時,該代碼也不起作用。 當我這樣做時,我得到非常高的數字,然后 11 次迭代為 0,我的 i 值沒有改變。 由於某種原因,它在循環開始時的向量大小也為 3,但這可能與它仍然希望將第一項的 0 + 0 相加的事實有關。 它所犯的錯誤是將兩個正確的值相加,並以某種方式以負值 integer 結束。 這會拋出循環的 rest 的所有其他值。

#include <iostream>
#include <vector>

int main(){

    std::vector<int> vector;
    vector.push_back(0);
    vector.push_back(1);

    for (int i=0; i <= 47; i++) {
        if (i < 1) {
            std::cout << vector[i] << ", \n";
        }
        vector.push_back(vector[i] + vector[i + 1]);
        std::cout << vector[i] << " = " << vector[i-2] << " + " << vector[i-1] << ":  " << "vector size" << vector.size() << ", \n";
    }
}

負值應該對您有很大的提示。 int的最大值為2147483647 您溢出int並且它環繞為負數。

如果您使用更大的類型,例如std::uint64_t ,則可以將溢出推遲相當大的數量。 其最大值為: 18446744073709551615

最后,在循環中打印會產生很多難以解讀的重復。 只需在循環完成后打印您的向量,並使用較少的迭代次數進行測試,以確保您的算法正常運行。

#include <cstdint>
#include <iostream>
#include <limits>
#include <vector>

int main() {
  std::vector<std::uint64_t> vector{0, 1};

  for (int i = 0; i < 47; i++) {
    vector.push_back(vector[i] + vector[i + 1]);
  }

  for (auto i : vector) {
    std::cout << i << ' ';
  }
  std::cout << '\n';
}

創建序列的 for 循環迭代47次,因此請仔細檢查您的要求。

我不太了解 C++,但據我所知,您使用的是int ,有符號整數的范圍通常從-2,147,483,6482,147,483,647 斐波那契數列中的第 47 個數字是2,971,215,073 ,所以這比您可以存儲在 int 中的要多。 當你溢出它(超出它的極限)你會得到各種各樣的廢話。 好吧,實際上不是廢話,當您 go 超出限制一個數字時,例如 2,147,483,648,您應該得到-2,147,483,648(您 go 從最小數字上偏移一個),因此數量是最小數字(-2,147,483,648)。 如果您嘗試存儲的數字太小(下溢),也會發生同樣的情況,一旦低於最低數字,它將變為正數。

在您的情況下,您至少需要一個無符號整數,並且要存儲更大的數字,您有long intlong long intunsigned long long int

暫無
暫無

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

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