Вычисление чисел последовательности Фибоначчи - C (СИ)
Формулировка задачи:
По заданию программа, выполняет вычисление 500 первых чисел последовательности Фибоначчи. Элементы последовательности Фибоначчи вычисляются по следующему рекуррентному соотношению:
В этом случае программа вычисляет только 298 чисел
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; }
Решение задачи: «Вычисление чисел последовательности Фибоначчи»
textual
Листинг программы
for(;i<=298;i++) {
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д