C ++ длинные целые странности?

0

Я изучаю некоторые начинающие алгоритмы, когда я знакомлюсь с C++. Уже есть некоторые ошибки, о которых я не знаю, с чего начать исправление.

1) Ниже приводятся множе- ственные ошибки во времени, когда функция fib() возвращает результаты. EDIT: с входами> = 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 ================

Для меня это не имеет никакого смысла. Спасибо за любую помощь.

Теги:
long-integer
segmentation-fault

4 ответа

4
Лучший ответ
int fibs[] = {1, 1};  

эквивалентно:

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

Другими словами, массив fibs (в обеих программах) имеет только два элемента, он не допускает доступа к fibs[n] если n больше 1.

  • 1
    Это не первый раз, когда я вижу, что кто-то думает, что [] означает неограниченный размер. Возможно, где-то есть плохой учитель или учебник.
  • 0
    О дерьмо. Но как это работает для входов меньше 9 в моих тестах. Полностью сбил меня с пути, иначе я бы это поймал. Благодарю.
Показать ещё 1 комментарий
2

Другие ответы объясняют, что неправильно. Чтобы исправить это, вы можете объявить fibs как вектор:

vector<int> fibs(n, 1);

который построит вектор из n целых чисел и инициализирует их все до 1. Замена этой единственной строки кода должна быть все, что вам нужно!

  • 1
    (И в несвязанном вопросе вы должны обрабатывать n <1 отдельно.)
  • 1
    Или вы можете просто объявить достаточно большой статический массив, учитывая, что числа Фибоначчи быстро становятся слишком большими для любого примитивного целочисленного типа.
2

В

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

[] не означает "столько, сколько нужно", это означает "подсчитать количество инициализаторов". Это то же самое, что и

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

И комментарий

// dynamic array

просто НЕПРАВИЛЬНО.

  • 0
    Должно быть, я был полусонный, когда читал учебник или что-то в этом роде, потому что я клянусь, я где-то читал "динамический" Тогда все как обычно, правильная декларация и фиксированный размер во время компиляции.
  • 1
    @Kafeaulait: со средним качеством учебников по C ++ вы, скорее всего, правильно его прочитали ... Получите хорошую книгу и узнайте о векторах; это не хороший вариант использования для массивов.
Показать ещё 1 комментарий
1

Да, это не сработает, потому что fibs [2] не существует!

Это не динамический массив каким-либо средним значением. Его массив из 2 длинных

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню