Вычисление чисел последовательности Фибоначчи - 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++) {