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 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
| #include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define PUISSANCE 9 // base=10^PUISSANCE
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 NbrChiffres (int nbr);
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));
if(nbr1 == NULL || nbr2 == NULL)
{
printf("Erreur à l'allocation de nbr1 ou nbr2\n");
return EXIT_FAILURE;
}
nbr1[0]=1;
nbr2[0]=1;
AffichNbr(FibGdNbr(&nbr1,&nbr2,n,&taille), &taille);
free(nbr1);
free(nbr2);
return EXIT_SUCCESS;
}
int NbrChiffres (int nbr) // retourne le nombre de chiffres contenu dans un nombre
{
int cpt=0;
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 départ
{
int i;
nbr[0]=1;
for (i=1; i<taille; i++)
nbr[i]=0;
}
*/
void AffichNbr (int* nbr, int* taille) // Bidouillage de l'affichage pour passer de la base 10^PUISSANCE à la base 10
{
int i, j;
printf("%d", nbr[(*taille)-1]);
for (i=1; i<*taille; i++)
{
int NbrZeros=PUISSANCE-NbrChiffres(nbr[(*taille)-1-i]);
for(j=0; j<NbrZeros; j++)
printf("0");
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,(int)pow(10,PUISSANCE),*taille) == 1 ) // si le nombre de chiffres de la somme de nbr1 et nbr2 (avec nbr2>nbr1) dépasse le nombre de cases du tableau alors
{
*nbr2=realloc(*nbr2,(*(taille)+1)*sizeof(int)); // on agrandit la taille de nbr2 d'une case
if(*nbr2 == NULL)
printf("Erreur à la réallocation de nbr2\n"); // je ne sais pas comment arrêter le programme (un return EXIT_FAILURE ne fonctionne que dans le main)
else
{
(*nbr2)[*taille]=1; // on applique le reste non appliqué précédement, à cette nouvelle case
CopyTab(*nbr1,tmp,*taille); // on copie les éléments avant d'augmenter la taille de nbr1
}
*nbr1=realloc(*nbr1,((*taille)+1)*sizeof(int));
if(*nbr1 == NULL)
printf("Erreur à la réallocation de nbr1\n");
else
(*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)*sizeof(int)); // et on ajoute une case à tmp qui recevra nbr2
if(tmp == NULL)
printf("Erreur à la réallocation de tmp\n");
(*taille)++;
}
else
CopyTab(*nbr1,tmp,*taille);
i++;
}
free(tmp);
return *nbr2;
} |
Partager