begin process at 2012 05 27 16:23:24
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

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

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


 Information sur la source

Note :
10 / 10 - par 1 personne
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Maths & Algorithmes Niveau :Débutant Date de création :02/03/2003 Date de mise à jour :03/03/2003 13:23:01 Vu :4 067

Auteur : TheBabyCool

Ecrire un message privé
Site perso
Commentaire sur cette source (5)
Ajouter un commentaire et/ou une note

 Description

Deux petit fonction utile pour certain algo.

Point fort :
- avec deux nombre entre 999 millions et 100 millions le programme met une seconde(xp2400+) pour executer l'operation 1 million de fois. Bref, c'est rapide.  

REMARQUE : La fonction PGDC avait d'abort été fait en récursif puis suite au conseil de BruNews je l'ai refaite en itératif.

Source

  • #include <stdio.h>
  • #include <stdlib.h>
  • //La fonction PGDC en récursif
  • /*
  • long PGCD(long a, long b, long r)
  • {
  • if (!r) return b;
  • PGCD(b,r,b%r);
  • }
  • */
  • //La fonction PGDC en itératif
  • long PGCD(long a, long b)
  • {
  • long r;
  • r=a%b;
  • while(r)
  • {
  • a=b;
  • b=r;
  • r=a%b;
  • }
  • return b;
  • }
  • long PPCM(long a, long b)
  • {
  • return (a*b)/PGCD(a,b);
  • }
  • int main()
  • {
  • printf("%d\n",PGCD(731371571,775515735)); //,731371571%775515735
  • printf("%d\n",PPCM(731371571,775515735));
  • system("pause");
  • }
#include <stdio.h>
#include <stdlib.h>

//La fonction PGDC en récursif
/*
long PGCD(long a, long b, long r)
{
    if (!r) return b;
    PGCD(b,r,b%r);
}
*/

//La fonction PGDC en itératif

long PGCD(long a, long b)
{
    long r;
   
    r=a%b;

    while(r)
    {
      a=b;
      b=r;
      r=a%b;
    }    
    return b;
}

long PPCM(long a, long b)
{
    return (a*b)/PGCD(a,b);
}


int main()
{
    printf("%d\n",PGCD(731371571,775515735));  //,731371571%775515735
    printf("%d\n",PPCM(731371571,775515735));
    system("pause");
} 

 Conclusion

Compatible tout compilateur avec quelque petite adaptation au pire.    


 Sources du même auteur

CONVERSION BASE 2&LT;==&GT;10

 Sources de la même categorie

Source avec Zip UN EXAMPLE D'APPLICATION EN CUDA DE L'ALGORITHME DE SCAN POU... par oguzaras
Source avec Zip Source avec une capture CHIFFREMENT DE VIGENERE par lajouad
Source avec Zip Source avec une capture ANALYSE SYNTAXIQUE par lajouad
Source avec Zip Source avec une capture STRUCTURE D'UNE MATRICE PAR LES LISTE LINÉAIRE (NON CONTUGUS... par benzarabel
Source avec Zip Source avec une capture DESSINER UNE ARBRE BINAIRE( MODE CONSOLE): par benzarabel

Commentaires et avis

Commentaire de BruNews le 02/03/2003 22:29:27 administrateur CS

Supprime recursivite et vitesse *= 2 au moins.
ciao...

Commentaire de TheBabyCool le 02/03/2003 23:00:20

???

Commentaire de BruNews le 02/03/2003 23:26:50 administrateur CS

DWORD __stdcall euclid(DWORD x, DWORD y)
{
  DWORD t;
  if(!x || !y) return 0xFFFFFFFF;
  do {
    if(x &lt; 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...

Commentaire de BruNews le 02/03/2003 23:36:07 administrateur CS

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 &lt; nbr2) {tmp = nbr1; nbr1 = nbr2; nbr2 = tmp;}
  for(;;) {
    if((tmp = nbr1 % nbr2) == 0) return nbr2;
    nbr1 = nbr2; nbr2 = tmp;
  }
}
ciao...

Commentaire de nEUrOne le 03/03/2003 13:14:46

BruNews: y'a pas un moyen d'enlever le modulo ?

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,593 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales