Oui, tu prends le numéro dans son entier, tu récupères le reste de sa division euclidienne par 97 (grâce au modulo) que tu soustrais à 97. ça correspond à la petite formule que je t'ai mise dans ma première réponse.
Sinon j'ai l'impression que tu as les éléments du NIR et non le numéro dans son entier, d'où l'utilisation des puissances de 10 pour remonter ce NIR.
Si on imagine donc que tu as ces parties de NIR en entrée et que tu recherches la clé de contrôle en sortie tu peux déjà écrire le prototype suivant :
public int GetControlKey(int sex, int birthyear, int birthmonth,
int departmentcode, int towncode,
int ordernum);
(pour failloter tu peux aussi déterminer les contraintes des entrées de cet algo, comme "NIR pour une personne née en France métropolitaine hors Corse")
Dans cette fonction il faut remonter le NIR depuis ses éléments et pour cela on va utiliser les puissances de 10 pour "décaler" les valeurs en les positionnant comme dans le NIR :
{
long NIR = ordernum + towncode *10^3
+ departmentcode *10^6
+ birthmonth *10^8
+ birthyear *10^10
+ sex *10^12;
// ...
Maintenant qu'on a remonter le NIR on a plus qu'à appliquer la petite formule définie plus haut et retourner le résultat :
// ...
return (97 - (NIR % 97));
}
Voili voilou. Et dans le cas où l'entrée serait directement le NIR alors ça simplifie grandement la fonction, qui peut alors s'écrire en une seule ligne :
public int GetControlKey(long NIR) { return (97 - (NIR % 97)); }
PS : il y a peut-être des erreurs de syntaxe, j'ai pas fait de C++ depuis quelques temps déjà.