2008-09-29 7 views
1

En excluant le chiffre de contrôle, quel est le numéro de longueur minimum sur lequel l'algorithme luhn va fonctionner? Je pense que cela fonctionnerait sur n'importe quel nombre supérieur à 2 chiffres (encore une fois, en excluant le chiffre de contrôle).Quel est le numéro de longueur minimum sur lequel l'algorithme luhn va fonctionner?

La raison pour laquelle je demande est la suivante: si je itère sur tous les chiffres du numéro de droite à gauche. Cela provoque i% 2 == 0 (utilisé pour trouver d'autres positions dans le nombre) dans ma validation luhn pour échouer si le nombre est 3 chiffres ou moins (par exemple 125 - qui sur le papier semble être un nombre valide)

Évidemment, je pourrais changer ma condition de i% 2 == 0 à quelque chose d'autre mais si ce n'est pas le bon comportement pour l'algorithme, ce serait bien de le savoir.

+0

Qu'est-ce qui ne va pas avec i% 2? Vous commencez à partir du chiffre de gauche et descendez. –

+0

bien si vous avez 125 le chiffre de contrôle serait probablement 5. Cependant en utilisant i% 2 vous n'obtenez pas un nombre valide, car il double le chiffre de contrôle au lieu de '2'. – IaCoder

+0

En exécutant l'algorithme de Luhn pour 125, le 1 et le 5 sont "doublés" et obtiennent 221 et les chiffres s'ajoutent à 5. –

Répondre

3

L'algorithme de Luhn fonctionnerait sur deux chiffres. Il avertira si un seul chiffre est faux et certains (mais pas tous) des cas où les chiffres sont transposés. Heck, cela fonctionnerait théoriquement avec un chiffre, mais ce n'est pas très utile. Vous pouvez voir par vous-même en fixant un chiffre, puis en changeant l'autre et en vérifiant que chaque valeur de l'autre chiffre donnera une "somme de contrôle" unique. Avec seulement deux chiffres, cependant, ajouter simplement les chiffres mod 10 vous donnerait la même propriété, mais il n'attraperait aucune erreur de transposition.

-3

Wikipedia's entry on the Luhn algorithm a une implémentation C# qui utilise une méthode différente pour déterminer les chiffres alternatifs qui ne dépendent pas d'une opération mod.

bool CheckNumber(int[] digits) 
{ 
    int sum = 0; 
    bool alt = false; 
    for (int i = digits.Length - 1; i >= 0; --i) { 
    int thedigit = digits[i]; 
    if (alt) { 
     thedigit *= 2; 
     if (thedigit > 9) { 
     thedigit -= 9; 
     } 
    } 
    sum = (sum + thedigit) % 10; 
    alt = !alt; 
    } 
    return (sum == 0); 
} 
Questions connexes