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
| typedef struct {
unsigned short Chiffre[MAXNBCHIF];
short int Sgn;
short int NbChif;
} NUMBER;
BOOL Mult(NUMBER * N1, NUMBER * N2, NUMBER * N3) {
NUMBER Tmp1;
NUMBER * PN3;
int i, j;
int NbChif;
int NbChif1;
int NbChif2;
unsigned int Chiffre1;
unsigned int Chiffre2;
NbChif1 = N1->NbChif;
NbChif2 = N2->NbChif;
if (NbChif1 == 0 || NbChif2 == 0) {
MiseAZero(N3);
return TRUE;
}
NbChif = NbChif1 + NbChif2;
if (NbChif > MAXNBCHIF) {
MessageBox(hWndTop, "Nombre trop grand", szAppName, MB_OK);
return FALSE;
}
if (N3 != N1 && N3 != N2) PN3 = N3;
else PN3 = &Tmp1;
MiseAZero(PN3);
PN3->Sgn = N1->Sgn * N2->Sgn;
for (j = 0; j < NbChif1; j++) {
Chiffre1 = N1->Chiffre[j];
if (Chiffre1) {
Chiffre2 = 0;
for (i = 0; i < NbChif2; i++) {
Chiffre2 = Chiffre1 * N2->Chiffre[i] + PN3->Chiffre[i + j] + (Chiffre2 >> 16);
PN3->Chiffre[i + j] = (unsigned short) Chiffre2;
}
PN3->Chiffre[i + j] = (unsigned short) (Chiffre2 >> 16);
}
}
if (NbChif > 0 && PN3->Chiffre[NbChif - 1] == 0) NbChif--;
PN3->NbChif = NbChif;
if (N3 != PN3) *N3 = *PN3;
return TRUE;
}
void MiseAZero(NUMBER * N1) {
memset(N1, 0, sizeof(NUMBER));
N1->Sgn = 1;
} |
Partager