1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
| #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;
} |
Partager