Fibonacci数字的数组:当数组大小>时,元素没有意义。 28

时间:2015-10-05 16:35:52

标签: c++ arrays iteration fibonacci dev-c++

我有一个简短的C ++程序,它填充Fibonacci数字数组,然后计算术语的总和,并在屏幕上显示总和。

#include <iostream>

using namespace std;

const int SIZE = 10;

int main() {
    int sum = 0; // running sum
    int fib[SIZE]; // array of Fibonacci numbers

    // initialize 1st and 2nd elements = 1, the rest to 0
    for (int i = 2; i < SIZE; i++) { 
        fib[0] = 1; 
        fib[1] = 1; 
        fib[i] = 0; 
    }

    // populate the array:
    // next term in Fibonacci sequence: fib[current] - 1 + fib[current] - 2
    for (int i = 0; i < SIZE; i++) { 
        fib[i + 1] = fib[i] + fib[i - 1]; 
        sum = sum + fib[i + 1]; 
    }

    // display the contents and the sum
    for (int i = 0; i < SIZE; i++) { 
        cout << i + 1 << ": " << fib[i] << endl; 
    }
    cout << "\nSum of the Fibonacci numbers: " << sum << endl;

    //system("pause");
    return 0;
}

当我从SIZE = 10开始时,程序添加总和就好了......

输出:

1: 1
2: 1
3: 2
4: 3
5: 5
6: 8
7: 13
8: 21
9: 34
10: 55

Sum of the Fibonacci numbers: 231

--------------------------------
Process exited after 0.02942 seconds with return value 0
Press any key to continue . . .

事实上,SIZE在2到28之间的任何值都很有效。我得到了总和的正确值。

但是,当我尝试定义SIZE = 29或更高版本时,会发生这种情况:

输出:

1: 1
2: 32764
3: 32765
4: 65529
5: 98294
6: 163823
7: 262117
8: 425940
9: 688057
10: 1113997
.
.
.
25: 1519229809
26: -1836801828
27: -317572019
28: 2140593449
29: 1823021430

Sum of the Fibonacci numbers: 1160283831

--------------------------------
Process exited after 0.05147 seconds with return value 0
Press any key to continue . . .

我不明白为什么第二个元素从1变为32764,以及当我定义SIZE = 29或更大时,为什么我在数组中有负值。实际上,我将开始获取随机值,每次编译和运行后,每个值都会异常不同。

这与编译有关吗?可能会将数据类型从int更改为long?我是否只是用尽了占位符来代表数字?评论很感激。

P.S。我还没有递归地重写这个。但我并不太担心。

编辑:我真的很感谢这些评论。我每次都学习新东西。

3 个答案:

答案 0 :(得分:2)

你有:

for (int i = 0; i < SIZE; i++)
{
   fib[i + 1] = fib[i] + fib[i - 1];
   sum = sum + fib[i + 1];
}

对于i == 0,您正在进行fib[i-1],即fib[-1] 对于i == SIZE-1,您正在访问fib[SIZE] 它们是未定义行为的原因。

您需要使用:

sum = 2; // Takes care of fib[0] and fib[1]
for (int i = 1; i < SIZE-1; i++)
{
   fib[i + 1] = fib[i] + fib[i - 1];
   sum += fib[i + 1];
}

<强> PS

值得注意的是sum值大于44时SIZE溢出,fib[SIZE-1]溢出大于SIZE大于46 sizeof(int)溢出1}}是4.当long超过这些限制时,必须使用long longSIZE

答案 1 :(得分:1)

您的循环for (int i = 0; i < SIZE; i++) { fib[i + 1] = fib[i] + fib[i - 1]; sum = sum + fib[i + 1]; }正在写入fib阵列之外。具体而言,它是在fib[i + 1]=SIZE时写在i=fib[i + 1]-1位置。总和sum = sum + fib[i + 1];

也是如此

访问fib[i - 1]

i==0时发生了类似的错误

答案 2 :(得分:0)

请格式化您的代码,以便更好地阅读for循环。

为什么将fib[0]fib[1]设置为1. SIZE次?

所以fib [0]肯定是1之后:)

for (int i = 0; i < SIZE; i++) { 
    fib[i + 1] = fib[i] + fib[i - 1]; 
    sum = sum + fib[i + 1]; 
}

但是无论第二个循环fib[0]中的开销是1还是fib[1]fib[0] + fib[-1]变为fib[-1]

#include <iostream> #include <string> using namespace std; const int SIZE = 30; int main() { int sum = 0; // running sum int fib[SIZE]; // array of Fibonacci numbers // initialize 1st and 2nd elements = 1, the rest to 0 for (int i = 2; i < SIZE; i++) { fib[0] = 1; fib[1] = 1; fib[i] = 0; } // populate the array: // next term in Fibonacci sequence: fib[current] - 1 + fib[current] - 2 for (int i = 1; i < SIZE-1; i++) { fib[i + 1] = fib[i] + fib[i - 1]; sum = sum + fib[i + 1]; } // display the contents and the sum for (int i = 0; i < SIZE; i++) { cout << i + 1 << ": " << fib[i] << endl; } cout << "\nSum of the Fibonacci numbers: " << sum << endl; //system("pause"); return 0; } 是一个非常糟糕的索引,可以依赖并导致随机行为。

以下是它的工作原理:http://cpp.sh/54dg

Public Sub copyColFormat()

    With Worksheets("Sheet1").UsedRange

        .Columns("I").Copy
        .Columns("J").PasteSpecial Paste:=xlPasteFormats

        .Cells(1).Select
    End With

    Application.CutCopyMode = False

End Sub