FONCTION ITÉRATIVE(TRÈS RAPIDE) POUR TROUVER LE PGCD ET LE PPCM [TOUT COMPILATE

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
- - Dernière réponse : cs_nEUrOne
Messages postés
41
Date d'inscription
dimanche 17 novembre 2002
Statut
Membre
Dernière intervention
14 avril 2004
- 3 mars 2003 à 13:14
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/10495-fonction-iterative-tres-rapide-pour-trouver-le-pgcd-et-le-ppcm-tout-compilateur

BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16 -
Supprime recursivite et vitesse *= 2 au moins.
ciao...
TheBabyCool
Messages postés
34
Date d'inscription
dimanche 2 septembre 2001
Statut
Membre
Dernière intervention
4 mars 2003
-
???
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16 -
DWORD __stdcall euclid(DWORD x, DWORD y)
{
DWORD t;
if(!x || !y) return 0xFFFFFFFF;
do {
if(x < y) {
t x; x y; y = t;
}
x -= y;
} while(x);
return y;
}

ou en + meticuleux

__declspec (naked) DWORD __stdcall euclid(DWORD x, DWORD y)
{
__asm {
mov ecx, [esp+4] ; x
mov eax, [esp+8] ; y
or ecx, ecx
jz short euclERR
or eax, eax
jz short euclERR
euclNEXT:
cmp ecx, eax
mov edx, eax
jae short noswap
mov eax, ecx
mov ecx, edx
noswap:
sub ecx, eax
jnz short euclNEXT
ret 8
euclERR:
or eax, -1
ret 8
}
}
et d'autres versions a la pelle. Recursion n'est pas a bannir, mais faut toujours regarder si pas moyen de l'enlever.
ciao...
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16 -
Et une derniere forme en 64 bits pour varier.
typedef unsigned _int64 _ui64_;

_ui64_ Pgcd(_ui64_ nbr1, _ui64_ nbr2) // plus grand commun diviseur
{
_ui64_ tmp;
if(!nbr1 || !nbr2) return 0xFFFFFFFFFFFFFFFF; // si erreur
if(nbr1 < nbr2) {tmp nbr1; nbr1 nbr2; nbr2 = tmp;}
for(;;) {
if((tmp nbr1 % nbr2) 0) return nbr2;
nbr1 nbr2; nbr2 tmp;
}
}
ciao...
cs_nEUrOne
Messages postés
41
Date d'inscription
dimanche 17 novembre 2002
Statut
Membre
Dernière intervention
14 avril 2004
-
BruNews: y'a pas un moyen d'enlever le modulo ?