Составить нерекурсивную функцию вычисления N-го числа Фибоначчи - C (СИ) (78276)
Формулировка задачи:
Помогите пожалуйста с задачей по фибоначи. Необходимо составить нерекурсивную функцию вычисления N-го числа Фибоначчи и определить максимальное число N для которого можно правильно вычислить результат помещающийся в типе int
Функция вроде есть но она ничего на экран не выводит
int fib_n(int n) { n=20; if (n <= 2) return 1; int x = 1; int y = 1; int ans = 0; for (int i = 3; i <= n; i++) { ans = x + y; x = y; y = ans; } return ans; }
Решение задачи: «Составить нерекурсивную функцию вычисления N-го числа Фибоначчи»
textual
Листинг программы
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdint.h> #include <time.h> struct bignum { uint8_t *buffer; size_t count; }; inline static void bignum_create(struct bignum *bn, const char *number) { size_t i, length = strlen(number); bn->count = length; bn->buffer = (uint8_t*)malloc(length); for (i=0; i < bn->count; ++i) bn->buffer[i] = number[--length] - '0'; } inline static void bignum_destroy(struct bignum *bn) { free(bn->buffer); bn->buffer = NULL; bn->count = 0; } inline static void bignum_expand(struct bignum *bn, size_t new_length) { uint8_t *buffer = (uint8_t*)malloc(new_length); memcpy(buffer, bn->buffer, bn->count); memset(buffer + bn->count, 0, new_length - bn->count); bignum_destroy(bn); bn->buffer = buffer; bn->count = new_length; } inline static void bignum_copy(struct bignum *dst, const struct bignum *src) { if (src->count > dst->count) bignum_expand(dst, src->count); memcpy(dst->buffer, src->buffer, src->count); } inline static void bignum_add(struct bignum *res, const struct bignum *a, const struct bignum *b) { const struct bignum *t; size_t i, min_count, max_count; if (a->count < b->count) { min_count = a->count; max_count = b->count; t = b; } else { min_count = b->count; max_count = a->count; t = a; } if (max_count > res->count) bignum_expand(res, max_count); memset(res->buffer, 0, res->count); for (i=0; i<max_count; ++i) { res->buffer[i] += (i < min_count ? a->buffer[i] + b->buffer[i] : t->buffer[i]); if (res->buffer[i] > 9) { if ((i+1) >= max_count) bignum_expand(res, max_count + 1); res->buffer[i+1] = 1; res->buffer[i] -= 10; } } } inline static void bignum_print(struct bignum *bn) { size_t i; i = bn->count; while (i--) putchar(bn->buffer[i] + '0'); printf("\n"); } inline static void print_fibonacci(uint32_t count) { uint32_t i; struct bignum bn[3]; bignum_create(bn, "1"); bignum_create(bn + 1, "1"); bignum_create(bn + 2, "1"); // printf("1\n1\n"); for (i=2; i<count; ++i) { bignum_add(bn + 2, bn, bn + 1); bignum_copy(bn + i%2, bn + 2); // bignum_print(bn + 2); } bignum_print(bn + 2); bignum_destroy(bn); bignum_destroy(bn + 1); bignum_destroy(bn + 2); } int main(int ac, char *av[]) { clock_t begin, end; if (ac != 2) { printf("usage: %s <count>\n", av[0]); } else { begin = clock(); print_fibonacci(atoi(av[1])); end = clock(); printf("Tmie = %d ms\n", (end - begin) / (CLOCKS_PER_SEC / 1000)); } return 0; }
Объяснение кода листинга программы
- Структура
struct bignum
используется для представления чисел с плавающей точкой в программе. Она содержит буфер для хранения числа и его длину. - Функция
bignum_create
создает экземпляр структурыstruct bignum
и инициализирует его заданным числом. - Функция
bignum_destroy
освобождает выделенную память дляstruct bignum
. - Функция
bignum_expand
расширяетstruct bignum
, увеличивая его размер. - Функция
bignum_copy
копирует содержимое одногоstruct bignum
в другой. - Функция
bignum_add
выполняет сложение двухstruct bignum
и сохраняет результат в третьемstruct bignum
. - Функция
bignum_print
выводит содержимоеstruct bignum
на экран. - Функция
print_fibonacci
вычисляет и выводит на экранN
-е число Фибоначчи. - В функции
main
программа принимает два аргумента: первый - имя программы, второй - число, которое определяет, сколько чисел Фибоначчи нужно вычислить. - Программа вычисляет и выводит на экран
N
-е число Фибоначчи, а затем выводит время, затраченное на выполнение этой операции.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д