Функция Фибоначчи для пользовательских чисел - PullRequest
1 голос
/ 23 марта 2019

Я делаю программу, подобную серии Фибоначчи, но для чисел вплоть до значения, предоставленного пользователем, например: от 0 до 5 (0, 1, 2, 3, 4). Программа должна рассчитать сумму чисел, переместиться вправо и вычислить остальные пять чисел. Это работает для серии Фибоначчи, но не для больших чисел. Кто-нибудь знает как это сделать?

#include <stdio.h>


int main() {

    int gg; //number which user inputs
    int dg = 0; //first number
    int next = 0;
    int n;
    int i;

    printf("Number of series: ");
    scanf("%d", &gg);

    printf("Positive integer: ");//max number which outputs in printf("Series: \n", gg), etc. 1000;
    scanf("%d", &n);

    printf("Series: \n", gg); //result

    for (i = 0; i < gg; i++) {
        printf("%d, ", i);
    }

    next = gg + dg;

    while(next <= n){
        printf("%d, ", next);
        dg = gg;
        gg = next;
        next = gg + dg;
    }

    return 0;
}

Для значений от 0 до 5 он должен вывести:

0, 1, 2, 3, 4, 10, 20, 39, 76, 149, 294...

Но выводит:

0, 1, 2, 3, 4, 5, 10, 15, 25, 40, 65, 105, 170, 275,

1 Ответ

1 голос
/ 24 марта 2019

Вам нужно сохранить последние n-е значения, а не только два последних значения.В вашем примере вам нужно сохранить последние пять значений.Для этого вы можете использовать массив:

#include <stdio.h>
#include <stdlib.h>

int main() {
    int series_number;
    int *previous_numbers;
    int marker = 0;
    int max_series_value;
    int next = 0;

    printf("Number of series: ");
    scanf("%d", &series_number);

    printf("Positive integer: ");
    scanf("%d", &max_series_value);

    printf("Series %d: \n", series_number);

    previous_numbers = malloc(sizeof *previous_numbers *series_number);
    for (int i = 0; i < series_number; i++) {
        printf("%d, ", i);
        previous_numbers[i] = i;
        next += i;
    }
    previous_numbers[marker] = next;
    marker = (marker+1) % series_number;

    while(next <= max_series_value){
        printf("%d, ", next);
        next = 0;
        for (int i = 0; i < series_number; i++) {
            next += previous_numbers[(marker+i) % series_number];
        }
        previous_numbers[marker] = next;
        marker = (marker+1) % series_number;
    }
    free(previous_numbers);

    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...