2017-09-09 4 views
2

J'ai le code suivant pour valider IMEI (non SV)IMEI ne passant pas Luhn Checksum

public static boolean luhnc(char[] digits) { 
    int sum = 0, s = 0; 
    for (int i = 0; i < digits.length - 1; i += 2) { 
     s = (digits[i+1] - '0') * 2; 
     sum += (s > 10 ? s - 9 : s) + (digits[i] - '0'); 
    } 
    return 10 - (sum % 10) == (digits[digits.length-1] - '0'); 
} 

Presque tous les IMEI vérifie à l'exception de mon Samsung Galaxy Note 4.

Je ne veux pas poster ici pour des raisons évidentes mais en même temps j'ai besoin de quelqu'un pour vérifier que cela fonctionne.

Peut-être que c'est ma mise en œuvre qui ne va pas.

Aidez-nous s'il vous plaît.

Répondre

1

Il y a un point que vous manquez à Luhn algo après faire l'opération *2, il est

  • si le nombre est >=10 (et non >), parce que 10 devient 0 au lieu de 1

Donc, corrigez comme ceci (je l'extrait dans une nouvelle ligne pour être clair pour vous):

for (int i = 0; i < digits.length - 1; i += 2) { 
    s = (digits[i + 1] - '0') * 2;     
    sum += (s >= 10 ? s - 9 : s) + (digits[i] - '0'); 
} 

Aussi je vous recommande d'utiliser un int[] au lieu de char[] pour enlever le - '0' partout

+0

Ah. Merci. Donc c'est *> = * et pas *> *. Il valide maintenant. Merci. Inversement, nous pouvons soustraire 9 pour obtenir le même résultat en ajoutant les deux chiffres du plus grand nombre. :) – TheRealChx101

+0

@ TheRealChx101 ha oui vous avez raison, je ne pense jamais à faire de cette façon ^^ – azro