C ++长整数奇数?

时间:2014-01-01 06:37:45

标签: c++ segmentation-fault long-integer

我正在熟悉一些初学者的算法,因为我熟悉C ++。已经有一些错误我不知道从哪里开始修复。

1)以下给出了fib()函数返回结果时的seg错误。 编辑:输入> = 9

#include <iostream>

using namespace std;

int fib(int n) {
    int fibs[] = {1, 1};    // dynamic array
    int i = 2;              // start at 3rd element
    while(i < n) {
        fibs[i] = fibs[i-2] + fibs[i-1];
        cout << "DEBUG: fibs[" << i << "] = " << fibs[i] << endl;
        i = i+1;
    }
    cout << "about to return to main()" << endl;
    return fibs[n-1];
}

int main() {
    cout << "\n================= Hello cruel world =================" << endl;
    cout << "Enter a number:  ";
    int x;
    cin >> x;
    cout << "fib(" << x << ") = " << fib(x) << endl;
    cout << "================ Goodbye cruel world ================\n" << endl;
    return 0;
}

否则,代码工作正常,数字正确找到。但是2)当我改变函数以支持长整数时,它开始表现得很奇怪:

#include <iostream>

using namespace std;

long fib(int n) {
    long fibs[] = {1L, 1L};    // dynamic array
    int i = 2;                 // start at 3rd element
    while(i < n) {
        fibs[i] = fibs[i-2] + fibs[i-1];
        cout << "DEBUG: fibs[" << i << "] = " << fibs[i] << endl;
        i = i+1;
    }
    cout << "about to return to main()" << endl;
    return fibs[n-1];
}

int main() {
    cout << "\n================= Hello cruel world =================" << endl;
    cout << "Enter a number:  ";
    int x;
    cin >> x;
    cout << "fib(" << x << ") = " << fib(x) << endl;
    cout << "================ Goodbye cruel world ================\n" << endl;
    return 0;
}

输出:

================= Hello cruel world =================
Enter a number:  7
DEBUG: fibs[2] = 2
DEBUG: fibs[0] = 1
DEBUG: fibs[1] = 30071067265
DEBUG: fibs[2] = 30071067266
DEBUG: fibs[14] = 0
about to return to main()
fib(7) = 140733637791872
================ Goodbye cruel world ================

它对我没有任何意义。谢谢你的帮助。

4 个答案:

答案 0 :(得分:4)

int fibs[] = {1, 1};  

相当于:

int fibs[2] = {1, 1};  

换句话说,数组fibs(在两个程序中)只有两个元素,如果fibs[n]大于n,则访问1是非法的。

答案 1 :(得分:2)

long fibs[] = {1L, 1L};

[]并不意味着“它需要的大”,它意味着“计算初始化者的数量”。它与

相同
long fibs[2] = { 1L, 1L };

评论

// dynamic array

简直错了。

答案 2 :(得分:2)

其他答案解释了什么是错的。要解决此问题,您可以将fibs声明为向量:

vector<int> fibs(n, 1);

将构造一个n个整数的向量并将它们全部初始化为1.替换那一行代码就应该是你所需要的!

答案 3 :(得分:1)

是的,它会失败,因为fibs [2]不存在!

这不是任何意思的动态数组。它的数组为2长

long fibs[] = {1L, 1L};    // dynamic array