为什么斐波那契数列计算C++中偶尔会出现负值?

问题描述 投票:0回答:1

我编写了一个用 C++ 计算斐波那契数列的程序。下面是代码

#include <iostream>
using namespace std;

int main() {
    int n, t1 = 0, t2 = 1, nextTerm = 0;

    cout << "Enter the number of terms: ";
    cin >> n;

    cout << "Fibonacci Series: ";

    for (int i = 1; i <= n; ++i) {
        // Prints the first two terms.
        if(i == 1) {
            cout << t1 << ", ";
            continue;
        }
        if(i == 2) {
            cout << t2 << ", ";
            continue;
        }
        nextTerm = t1 + t2;
        t1 = t2;
        t2 = nextTerm;

        cout << nextTerm << ", ";
    }
    return 0;
}

当我输入时

n = 100;
,列表就会增长。并且出现了一些负数。

我知道这是由于数据类型限制而发生的。但我的问题是为什么有些是负面的,有些是正面的价值。
像-285007387、-945834654、-1230842041、2118290601887448560、-1289228135、-401779575、-1691007710
这是输出中间某处的示例。

Enter the number of terms: 100
Fibonacci Series: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, 17711, 28657, 46368, 75025, 121393, 196418, 317811, 514229, 832040, 1346269, 2178309, 3524578, 5702887, 9227465, 14930352, 24157817, 39088169, 63245986, 102334155, 165580141, 267914296, 433494437, 701408733, 1134903170, 1836311903, -1323752223, 512559680, -811192543, -298632863, -1109825406, -1408458269, 1776683621, 368225352, 2144908973, -1781832971, 363076002, -1418756969, -1055680967, 1820529360, 764848393, -1709589543, -944741150, 1640636603, 695895453, -1958435240, -1262539787, 1073992269, -188547518, 885444751, 696897233, 1582341984, -2015728079, -433386095, 1845853122, 1412467027, -1036647147, 375819880, -660827267, -285007387, -945834654, -1230842041, 2118290601, 887448560, -1289228135, -401779575, -1691007710, -2092787285, 511172301, -1581614984, -1070442683, 1642909629, 572466946, -2079590721, -1507123775, 708252800, -798870975, -90618175, -889489150, 
Process finished with exit code 0
c++ type-conversion fibonacci
1个回答
0
投票

斐波那契数列中同时出现正数和负数是由于整数溢出。

当整数溢出时,它的值会回绕。对于有符号整数(通常使用二进制补码表示形式),当值超过数据类型可表示的最大正值时,它会“回绕”到最大负值并继续减小。这解释了为什么在达到较大的正值后您会看到负值。

例如,使用 32 位有符号整数:

  • 当超过最大正值(2,147,483,647)时,该值 环绕到最大负值 (-2,147,483,648)。
  • 然后它继续向更多负值减小,直到 达到最小可表示值 (-2,147,483,648),之后 它会再次溢出并环绕到最大正值 值,形成正值到负值的循环。

这就是为什么在斐波那契数列中,在达到导致溢出的大正数后,您开始看到负值,并且当溢出结束时,序列继续以正负数交替。

© www.soinside.com 2019 - 2024. All rights reserved.