All pastes #2109180 Raw Edit

fibonacci

public c v1 · immutable
#2109180 ·published 2012-02-03 03:59 UTC
rendered paste body
#include <stdio.h>#include <stdlib.h>#include <math.h>int AddNbr (int* nbr1, int* nbr2, int base, int taille); void InitNbr (int* nbr, int taille);void AffichNbr (int* nbr, int* taille);void CopyTab (int* nbr1, int* nbr2, int taille);int* FibGdNbr(int* nbr1, int* nbr2, int n, int* taille);int NbrChiffre (int n);int main(int argv, char* argc[]){    int *nbr1, *nbr2;    int n=atoi(argc[1]);    int taille=1;    nbr1=malloc(sizeof(int));    nbr2=malloc(sizeof(int));    nbr1[0]=1;    nbr2[0]=1;    //InitNbr(nbr1,taille);    //InitNbr(nbr2,taille);    AffichNbr(FibGdNbr(nbr1,nbr2,n,&taille), &taille);    free(nbr1);    free(nbr2);    return EXIT_SUCCESS;}/*int NbrChiffre (int n) // fonction bte qui essaie de dterminer  l'avance le nombre de chiffres dans fib(n) (le problme tant qu'on ne peut pas le dterminer aprs fib(92) car impossible de stocker la valeur dans une variable){    int cpt=0;    long long int nbr;    nbr=1/sqrt(5)*((int)pow( (1+sqrt(5))/2, n) );    while (nbr>=1)    {        nbr/=10;        cpt++;    }    return cpt;}*/int AddNbr (int* nbr1, int* nbr2, int base, int taille) // renvoie 1 si depassement{    int i, ret=0;    for (i=0; i<taille; i++)    {        ret=nbr1[i]+nbr2[i]+ret;        if (ret>=base)        {            nbr1[i]=ret-base;            ret=1;        }        else        {            nbr1[i]=ret;            ret=0;        }    }    return ret;}/*void InitNbr (int* nbr, int taille) //inutile si ma taille de tableau est de 1 seule case au dpart{    int i;    nbr[0]=1;    for (i=1; i<taille; i++)        nbr[i]=0;}*/void AffichNbr (int* nbr, int* taille) // je passe un pointeur pour tre sr que la valeur de taille soit la mme que celle du main{    int i;    for (i=0; i<*taille; i++)        printf("%d", nbr[(*taille)-1-i]);    printf("\n");}void CopyTab (int* nbr1, int* nbr2, int taille){    int i;    for (i=0; i<taille; i++)        nbr1[i]=nbr2[i];}int* FibGdNbr(int* nbr1, int* nbr2, int n, int *taille){    int i=0;    int* tmp=malloc((*taille)*sizeof(int));    if(n==0 || n==1)        return nbr1;    else        while(i<n-2)        {            CopyTab(tmp,nbr2, *taille);            if( AddNbr(nbr2,nbr1,10,*taille) == 1 ) // si le nombre de chiffres de la somme de nbr1 et nbr2 (avec nbr2>nbr1) dpasse le nombre de cases du tableau alors            {                nbr2=realloc(nbr2,*(taille)+1); // on agrandit la taille de nbr2 d'une case                nbr2[*taille]=1; // on applique le reste non appliqu prcdement,  cette nouvelle case                CopyTab(nbr1,tmp,*taille); // on copie les lments avant d'augmenter la taille de nbr1                 nbr1=realloc(nbr1,(*taille)+1);                nbr1[*taille]=0; // on met  0 la nouvelle case pour ne pas affecter la somme au prochain tour de boucle                tmp=realloc(tmp,(*taille)+1); // et on ajoute une case  tmp qui recevra nbr2                 (*taille)++;            }            else                CopyTab(nbr1,tmp,*taille);            i++;        }        free(tmp);        return nbr2;}