IdentifiantMot de passe
Loading...
Mot de passe oubli� ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les r�ponses en temps r�el, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Algorithme de Luhn


Sujet :

C++

  1. #1
    Membre � l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    5
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 5
    Par d�faut Algorithme de Luhn
    Bonjour � tous.

    L'algorithme de Luhn permet de tester la validit� d'un code chiffr�, en utilisant une m�thode de v�rification de somme (checksum). Il est utilis� par exemple pour certifier les codes de carte de cr�dit.

    Mon but est d'impl�menter cet algo en langage C++ ; en m'aidant des docs de la toile (notament Wikipedia), j'ai �crit le code suivant :

    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    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
    int checkLuhn (char* code)
    {
    	int length, digit, sum, i ;
    	length = strlen(code) - 1 ;
     
    	// on parcourt tous les chiffres de droite à gauche..
    	for (i = length ; i >= 0 ; i--)
    	{
    		digit = code[i] ;
     
    		// si le rang <i> est pair (<i> XOR 1)..
    		if (i ^ 1)
    		{
    			// on double le chiffre placé au rang <i>..
    			digit *= 2 ;
     
    			// et si le chiffre est alors supérieur à 9, on fait la somme des chiffres (ex: 14 = 1+4 = 5)..
    			if (digit > 9)
    				digit -= 9 ;
    		}	
     
    		// on accumule enfin chaque chiffre "modifié"
    		sum += digit ;						
    	}
     
     	// si le résultat final est divisible par 10, retourne 1, sinon 0
    	return sum % 10 < 1 ;
    }
    L'ennui, c'est que, comme le sentiez venir, ce code ne semble pas fonctionnel.
    Lorsque, par exemple, je teste cette fonction avec le nombre 8763 (code qui devrait �tre valid� par l'algo), j'ai un code de retour nul (en clair le code n'est pas valid�).

    Je ne comprend pas d'o� viens l'erreur ; algo mal transcrit, erreur de syntaxe [...] ?
    Je sollicite donc votre aide.

    Merci d'avance.

  2. #2
    Membre �m�rite
    Profil pro
    Eleveur de cornichons
    Inscrit en
    Juin 2002
    Messages
    1 074
    D�tails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activit� : Eleveur de cornichons
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 074
    Par d�faut
    Bonjour et bienvenue sur les forums de Developpez

    Je t'avoue que je n'ai pas regard� ton code en d�tail car je pr�sume que tu connais l'algo mais � la derni�re ligne, au niveau du return, il manque peut-�tre des parenth�ses dans la mesure o� les op�rateurs de comparaisons (<,>,==, ...) sont prioritaires sur les op�rateurs +,-,*,/,...% .
    Pour faire plus simple, tu peux juste faire :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    // si le résultat final est divisible par 10, retourne 1, sinon 0
    return (sum % 10) ? 0 : 1 ;
    Nas'

  3. #3
    Membre � l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    5
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 5
    Par d�faut
    Merci pour l'accueil.. et pour l'astuce, je ne connaissais pas cette syntaxe.

    Quoi qu'il en soit, �a ne modifie pas l'issue (mauvaise) du code ; pour �tre s�r, j'avais auparavant essay� avec un if-then-else classique pour la valeur de retour (d'abord on code avec ce qu'on connait, et quand �a marche on optimise..).

    Par contre, je viens de me rendre compte que ce code ne marcherais qu'avec un code dont le nombre de chiffre est pair.. pour la robustesse, c'est pas g�nial, mais peu importe puisque pour l'instant je ne teste qu'avec mon num�ro de carte..

  4. #4
    Membre confirm�
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    162
    D�tails du profil
    Informations personnelles :
    �ge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2002
    Messages : 162
    Par d�faut
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    1
    2
    3
    4
    // si le rang <i> est pair (<i> XOR 1)...
    if (i ^ 1)
    {
      ...
    �a ne serait pas plut�t "if ( i % 2 == 0 )" ? parce que l�, avec le xor et, par exemple, i = 3, on aura 11b ^ 01b == 10b > 0 et le test sera valid�...

  5. #5
    Membre � l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    5
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 5
    Par d�faut
    Le XOR compare ici le bit de poids faible (premier en partant de la droite) de mon rang i avec 1.. enfin je crois ! L'op�rateur modulo fonctionne aussi, mais le processeur fait une op�ration de plus. (J'ai quand m�me essay� avec ce dernier, sans plus de succ�s qu'auparavant)

  6. #6
    Invit�
    Invit�(e)
    Par d�faut
    Utilise le "et binaire" dans ce cas, not� &, et non le ou exclusif binaire, not� ^

  7. #7
    Membre �clair�
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    Par d�faut
    Bonjour,

    moi je me demande s'il faudrait pas aussi initialiaser sum ...
    il a l'air tr�s gros sum ...

    Une solution d�taill�e :
    Code : S�lectionner tout - Visualiser dans une fen�tre � part
    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
     
    int checkLuhn (char* code)
    {
    	int length, digit, sum, i ;
    	length = strlen(code) ;
     
    	sum = 0;
     
    	// on parcourt tous les chiffres de droite à gauche..
    	for (i = 0 ; i < length; i++)
    	{
    		digit = code[i]-48;
     
    		// si le rang <i> est pair (<i> XOR 1)..
    		if ((i & 1) == 0)
    		{
    			// on double le chiffre placé au rang <i>..
    			digit *= 2 ;
     
    			// et si le chiffre est alors supérieur à 9, on fait la somme des chiffres (ex: 14 = 1+4 = 5)..
    			if (digit > 9)
    				digit -= 9 ;
    		}	
     
    		// on accumule enfin chaque chiffre "modifié"
    		sum += digit ;						
    	}
     
     	// si le résultat final est divisible par 10, retourne 1, sinon 0
    	return (sum % 10) ? 0 : 1 ;
    }
    sinon, avec moins de lignes de code :
    http://blogs.media-tips.com/bernard....5e2f9215e.aspx



    @+

  8. #8
    Membre � l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    5
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 5
    Par d�faut
    Effectivement, ton code marche. Grand merci � toi, le malin !

    Par contre, si tu pouvais juste m'�clairer sur cette ligne :
    (Pourquoi soustraire 48 ?)

    Et pourquoi est-il n�c�ssaire d'initialiser mon objet 'sum' ?

    Le lien que tu m'a pass� est un vrai mod�le d'optimisation, mais pour l'instant je pr�f�re m'en tenir � des codes un peu plus d�taill�s et compr�hensibles !

  9. #9
    Membre averti
    Inscrit en
    Avril 2005
    Messages
    38
    D�tails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 38
    Par d�faut
    Salut !
    En fait il est n�c�ssaire d'initialiser la variable sum avant de l'incr�menter directement car � cette endroit en m�moire il y avait probablement de la "scrap" et probablement pas 0... Donc si il y avait 9128841 � cette endroit avant que tu r�serve cette plage pour ton int sum, bah tu ajoute digit � 9128841, c'est donc pour ca qu'il faut le partir � z�ro... Tu n'aurais pas ce probl�me en C#. Mais en C++ � des fins de performances, le contructeur par d�faut du int n'est pas appel�. (on me corrige si j'ai tord.)

    Et ensuite le -48, vient du code ASCII ... 0 en ASCII c'est 48, 1 c'est 49, 2 c'est 50 ... Tu te doutes surement de la suite... donc pour obtenir r�ellement 3 (qui est 51 en ASCII) alors tu dois soustraire 48...

    Voil� ! Longue vie � toi !.

    Yannick

  10. #10
    Expert confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyr�n�es)

    Informations professionnelles :
    Activit� : D�veloppeur informatique
    Secteur : A�ronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Ao�t 2003
    Messages : 5 296
    Par d�faut
    Ah .. les joies de l'obfuscation ...
    s/48/'0'/
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne r�ponds � aucune question technique par le biais de ce m�dia. Et de toutes fa�ons, ma BAL sur dvpz est pleine...

  11. #11
    Membre � l'essai
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    5
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 5
    Par d�faut
    Citation Envoy� par YmYannick
    Et ensuite le -48, vient du code ASCII ... 0 en ASCII c'est 48, 1 c'est 49, 2 c'est 50 ... Tu te doutes surement de la suite... donc pour obtenir r�ellement 3 (qui est 51 en ASCII) alors tu dois soustraire 48...
    Aah oui, bien s�r.. Elementaire, mon cher !

    C'est un probl�me r�solu, je crois.

    Merci � tous pour vos �claircissements, et � bient�t !

+ R�pondre � la discussion
Cette discussion est r�solue.

Discussions similaires

  1. Algorithme de LUHN
    Par DelphiCool dans le forum Codes sources � t�l�charger
    R�ponses: 0
    Dernier message: 03/02/2013, 17h24
  2. Algorithme de randomisation ... ( Hasard ...? )
    Par Anonymous dans le forum Assembleur
    R�ponses: 8
    Dernier message: 06/09/2002, 14h25
  3. recherches des cours ou des explications sur les algorithmes
    Par Marcus2211 dans le forum Algorithmes et structures de donn�es
    R�ponses: 6
    Dernier message: 19/05/2002, 22h18
  4. Recherche de documentation compl�te en algorithmes
    Par Anonymous dans le forum Algorithmes et structures de donn�es
    R�ponses: 1
    Dernier message: 29/03/2002, 12h09
  5. Algorithme g�n�tique
    Par Stephane.P_(dis Postef) dans le forum Algorithmes et structures de donn�es
    R�ponses: 2
    Dernier message: 15/03/2002, 17h14

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo