Вычисление чисел последовательности Фибоначчи - C (СИ)

Узнай цену своей работы

Формулировка задачи:

По заданию программа, выполняет вычисление 500 первых чисел последовательности Фибоначчи. Элементы последовательности Фибоначчи вычисляются по следующему рекуррентному соотношению:
ai=ai-1+ai-2,a1=1,a2=1
В чем ошибка?
#include <stdio.h> // Подключаем стандартный ввод вывод
#include <conio.h> // Это модуль, который поддерживает функцию _getch()
#include <stdlib.h>
#include <string.h>
 
#define NUMMAX 1000 //длина массива
#define NUMBASE 1000000000 // длинна одной ячейки массива
#define NUMLEN(n) ((n)[0])
typedef int number_t[NUMMAX+1]; //тип массив из 1001 целого числа
 
void numzero (number_t lhs) // функция заменяет число, состоящее из
    // массива чисел на 0
{
    lhs[0]=1;
    lhs[1]=0;
}
 
void numassgns (number_t lhs, unsigned long long int rhs)
/*  функция записывает число от 0 до (2^64–1) в массив чисел
*/
{
    lhs[0]=0;
    while (rhs)
    {
        lhs[++lhs[0]]=rhs % NUMBASE;
        rhs /= NUMBASE;
    }
}
 
void numassgn (number_t lhs, const number_t rhs)
{
    int i;
    lhs[0]=rhs[0];
    for(i=1;i<=NUMLEN (rhs);++i)
        lhs[i]=rhs[i];
}
 
void numprint(const number_t lhs)
{
    int i;
    printf ("%d", NUMLEN(lhs) ? lhs[NUMLEN (lhs)]:0);
    for (i=NUMLEN(lhs)-1;i>0;--i)
        printf("%09d",lhs[i]);
}
 
void numadd(number_t res, const number_t lhs, const number_t rhs)
{
    int i=0, c=0;
    const int *sn=NUMLEN (lhs) < NUMLEN (rhs) ? lhs:rhs;
    const int *ln=sn==lhs ? rhs:lhs;
    while (i<NUMLEN (sn))
    {
        ++i;
        res[i]=c+sn[i]+ln[i];
            c=res[i]>NUMBASE?1:0;
            if (c) res[i]-=NUMBASE;
    }
    while (i<NUMLEN(ln))
    {
        ++i;
        res[i]=c+ln[i];
        c=res[i]>NUMBASE?1:0;
        if (c) res[i]-=NUMBASE;
    }
    if (c) res[++i]=c;
    res[0]=i;
}
// Задание 1
void numtoa(const number_t num, char *str) {
    int i;
    char podstr[10];    
    str[0]='\0';
    i=num[0];
    for(;i>0;i--) {
    itoa(num[i],podstr,10); 
    strcat(str,podstr);
    }   
}
// Задание 2
void atonum(const char *str, number_t num) {
    int len,shet, k, i;
    char podstr[10];
    
    len=strlen(str);
    k=len-9;
    if (len % 9 !=0) {
        num[0]=len/9+1;
        shet=len % 9;
    }
    else {
        num[0]=len/9;   
        shet=9;
    }   
 
    podstr[0]='\0';
    strncat(podstr, str, shet );    
    num[num[0]]=atoi(podstr);
 
    shet=1;
    while(shet<num[0]) {
    podstr[0]='\0';
    for (i=0;i<9;i++) {
    podstr[i]=str[k+i]; 
    }
    podstr[i]='\0';
    num[shet]=atoi(podstr);
    k-=9;
    shet++;
    }
        
}
// 3-е задание
void fibonachi() {
    //определяем первое число = 1
    FILE *fp;
    number_t f1, f2, f3;
    int i=2;
    f1[0]=1;
    f1[1]=1;
    //определяем второе число = первому числу
    numassgn(f2, f1);
    numprint(f1);
    printf("\n");
    numprint(f2);
    printf("\n");
    for(;i<=298;i++) {
        numadd(f3, f1, f2);
        numassgn(f1, f2);
        numassgn(f2, f3);
        numprint(f2);
        printf("\n");
    }

}
int main()
{
    number_t dlchislo;
    unsigned long long int first=12345678910111213141;
    char *st, c[255];
    int i;  
    
    numassgns(dlchislo, first); 
    // преобразование длинного числа в строку
    st=(char*)malloc(9*dlchislo[0]+1);
    numtoa(dlchislo, st);
    printf("%s - eto stroka \n", st);
    free(st);
    // преобразование строки в длинное число
    printf("\n\nVvedite sroku iz tsifr\n");
    scanf("%s/n", &c);
    atonum(c,dlchislo);
    numprint(dlchislo);
 
    printf("\n\n chisla fibonachi\n");
    fibonachi();
    _getch();
    return 1;
}
В этом случае программа вычисляет только 298 чисел

Решение задачи: «Вычисление чисел последовательности Фибоначчи»

textual
Листинг программы
for(;i<=298;i++) {

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.727 из 5
Похожие ответы