我有一个简短的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。我还没有递归地重写这个。但我并不太担心。
编辑:我真的很感谢这些评论。我每次都学习新东西。
答案 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 long
或SIZE
。
答案 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