Ir ao conteúdo
  • Cadastre-se

Dúvida em exercício sobre Fibonacci


jeffprog
Ir à solução Resolvido por dontpanic,

Posts recomendados

Olá pessoa. Estou com algum problema no meu código para resolver um exercício sobre Fibonacci. O enunciado do exercício é o seguinte: Fazer um programa para mostrar os 100 primeiros termos da série de Fibonacci.

 

Como pode ser visto no código abaixo utilizei variáveis do tipo float pois com int e long int não consegui exibir os valores depois de um certo número que era muito grande.

 

Outro detalhe é que a solução de forma não recursiva é proposital pois o exercício encontra-se na parte de Estruturas de Repetição da lista que estou praticando.

 

Eu conferia a sequência por esse site http://www.educ.fc.ul.pt/icm/icm99/icm41/os100.htm e detectei que o programa informa os valores corretamente até o fib(36).

 

Utilizei como IDE o Dev-C++ 5.6.0 mas testei também no CODE::BLOCKS e problema continuou o mesmo.

 

Serei grato caso alguém possa me ajudar.

 

Código:

#include <stdio.h>#include <stdlib.h> int main(){ int i;float f1 = 0.0f;float f2 = 1.0f;float f3; printf("%.f\n",f1); printf("%.f\n",f2); for(i=2;i<100;i++){    f3 = f1 + f2;    printf("%.f\n",f3);     f1 = f2;   f2 = f3;} printf("\n"); system("pause"); return 0;}
  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • Solução

O último da série (o 99) é:

F(99) = 218.922.995.834.555.169.026

 

E pra representar ele você vai precisar de mais de 8 bytes.

Dependendo do compilador que você esteja usando, do sistema operacional (32bits, 64bits), etc, é bem provável que o valor máximo que você consiga representar usando apenas o C puro e as bibliotecas padrão, seja 8 bytes usando um "unsigned long long int".

 

Eu testei aqui e consegui ir até F(93):

 

#include <stdio.h>#include <stdlib.h> int main() {     int i;    unsigned long long int f1 = 0;    unsigned long long int f2 = 1;    unsigned long long int f3;     printf("%llu\n",f1);    printf("%llu\n",f2);     for( i=2; i<100; i++) {        f3 = f1 + f2;         printf("%d - %llu\n",i,f3);        f1 = f2;        f2 = f3;    }    printf("\n");     return 0;}
 

Depois do 93, nem mesmo os 8 bytes do longlongint dão conta... daí pra representar valores maiores que esse você vai precisar usar alguma biblioteca própria pra isso.

Eu sei que no visual studio existe alguns tipos que são capazes se representar valores maiores. Mas como você tá usando o gcc, recomendo dar uma olhada numa biblioteca chamada inttypes.h.

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

@jeffprog

 

 

Uma outra possível solução seria implementar uma rotina própria de soma que permitisse valores de tamanho praticamente arbitrários.

 

Tem um tópico aqui meio antigo onde dou uma ideia sobre como implementá-la.

 

 

http://forum.clubedohardware.com.br/forums/topic/1062816-sequencia-de-fibonacci/

 

 

 

LNW

  • Curtir 1
Link para o comentário
Compartilhar em outros sites

  • 4 anos depois...

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...