Zipo Ours bipolaire | Code :
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <time.h>
- #define MAX 100 /* taille maximale des grands entiers manipulA~(c)s */
- #define BASE 10000
- typedef unsigned int CHIFFRE;
- typedef CHIFFRE BIGNUM[MAX];
- void affiche(BIGNUM z)
- {
- /* affiche a l'ecran le grand entier z */
- int k;
- /* on cherche le chiffre le plus significatif */
- k=MAX-1;
- while ((k >=0) && (z[k] == 0))
- k--;
- /* si le nombre n'est pas nul */
- if (k >= 0)
- {
- /* on affiche le chiffre significatif */
- printf("%u",z[k]);
- k--;
- while (k >= 0)
- {
- /* le format %.4u ecrit sur 4 caracteres en completant a gauche par des 0 */
- /* si necessaire */
- printf("%.4u",z[k]);
- k--;
- }
- }
- else
- printf("0" );
- printf("\n" );
- }
- void zero(BIGNUM z)
- {
- /* initialise le grand entier z a zero */
- memset(z,0,sizeof(BIGNUM));
- }
- void alea(BIGNUM z, unsigned int n)
- {
- /* remplit les n premiers chiffres du grand entier z de fac,on aleatoire */
- unsigned int j;
-
- zero(z);
- srand(time(NULL));
- for (j = 0; j < n; j++)
- z[j] = rand() % BASE;
- }
- void copier(BIGNUM x, BIGNUM y)
- {
- /* copie la valeur du grand entier x dans le grand entier y */
- memcpy(y,x,sizeof(BIGNUM));
- }
- /***** PARTIE A COMPLETER *************/
- void inc(BIGNUM z)
- {
- int i=0;
- while ( ((z[i] + 1) % BASE == 0) && (i<MAX) )
- { z[i] = 0;
- i++;
- }
- z[i] += 1;
- }
- unsigned char plusgrand(BIGNUM z, BIGNUM y)
- { int k;
- k=MAX-1;
- while ((k >=0) && (z[k] == 0) && (y[k] == 0))
- k--;
- if ( z[k] >= y[k] )
- return 1;
- else
- return 0;
- }
- void sub(BIGNUM z, BIGNUM y)
- { int k, c;
- BIGNUM x;
- copier(y, x);
-
- for( k=0 ; k<MAX ; k++)
- {
- if( z[k] >= x[k] )
- z[k] -= x[k];
- else {
- c = z[k] - x[k];
- z[k] = BASE + c;
-
- if(k<MAX-1)
- x[k+1] += 1;
- }
- }
- }
- void divise(BIGNUM a, BIGNUM b, BIGNUM q, BIGNUM r)
- {
- BIGNUM x;
- copier(a, x);
- zero(q);
-
- while ( plusgrand(x, b) ){
- sub(x, b);
- inc(q);
- }
- copier(x, r);
- }
- int notnul(BIGNUM a)
- {
- int k = MAX-1;
- while (k >= 0){
- if (a[k] != 0)
- return 1;
-
- k--;
- }
- return 0;
- }
- void pgcd(BIGNUM a, BIGNUM b, BIGNUM d)
- {
- if ( notnul(b) == 0 )
- copier(a, d);
-
- else{
- if ( plusgrand(a, b) )
- { sub(a, b);
- pgcd(a, b, d);
- }
- else pgcd(b, a, d);
- }
- }
- int main()
- {
- BIGNUM a,b,q,r,d;
-
- zero(a);
- zero(b);
- a[15] = 998;
- a[1] = 12;
- b[14] = 8;
- b[0] = 3;
- printf("a = " );
- affiche(a);
- printf("b = " );
- affiche(b);
- divise(a,b,q,r);
- printf("q = " );
- affiche(q);
- printf("r = " );
- affiche(r);
- zero(a);
- zero(b);
- a[4] = 768;
- a[1] = 12;
- a[0] = 727;
- b[3] = 2179;
- b[2] = 2321;
- b[0] = 428;
- printf("a = " );
- affiche(a);
- printf("b = " );
- affiche(b);
-
- pgcd(a, b, d);
- printf("d = " );
- affiche(d);
- return 0;
- }
|
Bonjour, voila je sors d'examen de TP de C
J'ai apparemennt tout fait mais lorsque j'execute la derniere fonction (pgcd) j'obtenais une segmentation fault (snif)
J'ai cherché tout le temps qui me restait mais j'ai pas trouvé d'ou venait l'erreur
Vous pouvez m'aider ? Pask du coup ca me turlupine, j'espère que ca vient pas d'autres fonctions au dessus ou quoi
Je précise que la main() et les fonctions affiche zero alea copier m'étaient données. voila
merci! ---------------
- mon feed-back
|