Un numéro d'identité nationale valide se compose de 17 chiffres (représentant la région, la date de naissance et le numéro séquentiel) suivis d'un caractère de contrôle. Le calcul du code de contrôle suit les étapes suivantes :
On effectue d'abord une somme pondérée des 17 premiers chiffres avec les poids {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2}. Le résultat de cette somme modulo 11 donne une valeur Z. Le code de contrôle M est ensuite déterminé selon la correspondance :
Z: 0 1 2 3 4 5 6 7 8 9 10
M: 1 0 X 9 8 7 6 5 4 3 2
Étant donné une liste de numéros d'identité, le programme doit vérifier la validité du code de contrôle et afficher tous les numéros erronés. On ne vérifie pas la validité des 17 premiers chiffres, seulement leur nature numérique et l'exactitude du code de contrôle calculé.
Format d'entrée :
La première ligne contient un entier N (≤ 100) endiquant le nombre de numéros. Les N lignes suivantes conteinnent chacune un numéro d'identité de 18 caractères.
Format de sortie :
Afficher chaque numéro erroné sur une ligne séparée dans l'ordre d'apparition. Si tous les numéros sont valides, afficher "Tous les numéros sont corrects".
Exemple d'entrée :
4
320124198808240056
12010X198901011234
110108196711301866
37070419881216001X
Exemple de sortie :
12010X198901011234
110108196711301866
37070419881216001X
Voici une implémentation possible en Java :
import java.util.Scanner;
import java.util.List;
import java.util.ArrayList;
public class VerifIdentite {
public static void main(String[] args) {
Scanner lecteur = new Scanner(System.in);
int nbreIdentites = Integer.parseInt(lecteur.nextLine());
List<String> identitesInvalides = new ArrayList<>();
for (int i = 0; i < nbreIdentites; i++) {
String identite = lecteur.nextLine();
if (!estValide(identite)) {
identitesInvalides.add(identite);
}
}
if (identitesInvalides.isEmpty()) {
System.out.println("Tous les numéros sont corrects");
} else {
identitesInvalides.forEach(System.out::println);
}
}
private static boolean estValide(String identite) {
if (identite.length() != 18) {
return false;
}
// Vérifier que les 17 premiers caractères sont des chiffres
for (int i = 0; i < 17; i++) {
if (!Character.isDigit(identite.charAt(i))) {
return false;
}
}
return verifierCodeControle(identite);
}
private static boolean verifierCodeControle(String identite) {
int[] poids = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
char[] codesControle = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};
int somme = 0;
for (int i = 0; i < 17; i++) {
int chiffre = Character.getNumericValue(identite.charAt(i));
somme += chiffre * poids[i];
}
int reste = somme % 11;
char codeAttendu = codesControle[reste];
return identite.charAt(17) == codeAttendu;
}
}
Les méthodes clés utilisées incluent :
Character.isDigit(char)- vérifie si un caractère est un chiffreCharacter.getNumericValue(char)- convertit un caractère numérique en sa valeur numériqueInteger.parseInt(String)- convertit une chaîne en entierforEach()- méthode pour itérer sur une colletcion