Почему я получаю числа Фибоначчи размером с мой массив? - PullRequest
0 голосов
/ 28 апреля 2020

Я хочу напечатать ряд Фибоначчи ниже 1000. Но в моем коде ниже я не знаю, почему я получаю числа Фибоначчи до максимального размера моего определенного массива?

int main(){
    int dp[22] = {0};

    dp[0] = 0, dp[1] = 1;
    count<<dp[0]<<" "<<dp[1]<<" ";
    for(int i=2; dp[i]<=1000; i++){
        dp[i] = dp[i-1] + dp[i-2];
        cout<<dp[i]<<" ";
    }

    cout<<endl;

    return 0;
}

Expected Output : 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
Actual Output : 0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597 2584 4181 6765 10946 

Ответы [ 2 ]

0 голосов
/ 30 апреля 2020

Вы должны переписать свой внутренний l oop следующим образом, чтобы он работал правильно:

for(int i=2; /* dp[i]<=1000 */; i++){
    dp[i] = dp[i-1] + dp[i-2];
    if( dp[i] > 1000 ) break;   // <<---- add this line
    cout<<dp[i]<<" ";
}

И на самом деле, я не совсем понимаю, зачем вам нужен массив для печати чисел, этот код будет печатать без какого-либо массива просто отлично:

int main()
{
    int a = 0, b = 1, c;
    while( a < 1000 ) {
        std::cout << a << " ";
        c = a + b;
        a = b;
        b = c;
    }
    std::cout << std::endl;
    return 0;
}
0 голосов
/ 30 апреля 2020

Проблема заключается в проверке dp[i]<=1000 в этой строке:

for(int i=2; dp[i]<=1000; i++){

Значение i - это индекс элемента массива next , который всегда содержит ноль, поэтому тест dp[i]<=1000 всегда возвращает true . Я не уверен, почему это не вызывает сбой памяти, когда вы go за концом массива. Просто случайность, наверное.

Возможно, for l oop, переписанный как while l oop, делает это более понятным:

int i = 2;

while (dp[i] <= 1000) {

    dp[i] = dp[i - 1] + dp[i - 2];

    cout << dp[i] << " ";

    i++;
}

Один из способов сделать эту работу, используя for l oop:

#include <iostream>
using namespace std;

int main() {
    int dp[22] = {0};

    dp[0] = 0;
    dp[1] = 1;

    cout << dp[0] << " " << dp[1] << " ";

    for (int i = 2; ; i++) {
        dp[i] = dp[i - 1] + dp[i - 2];

        if (dp[i] <= 1000) {
            cout << dp[i] << " ";
        } else {
            break;
        }
    }

    cout << endl;

    return 0;
}
...