Bonjour,
J’essaye d’implémenter l’algorithme de Luhn utilisé, par exemple, pour vérifier la validité d’une carte bancaire. L’algorithme est le suivant :
L’algorithme multiplie par deux un chiffre sur deux, en commençant par l’avant dernier et en se déplaçant de droite à gauche. Si un chiffre qui est multiplié par deux est plus grand que neuf (comme c’est le cas par exemple pour 8 qui devient 16), alors il faut le ramener à un chiffre entre 1 et 9. Pour cela, il y a 2 manières de faire (pour un résultat identique) :
- Soit les chiffres composant le doublement sont additionnés (pour le chiffre 8: on obtient d’abord 16 en le multipliant par 2 puis 7 en sommant les chiffres composant le résultat : 1+6).
- Soit on lui soustrait 9 (pour le chiffre 8 : on obtient 16 en le multipliant par 2 puis 7 en soustrayant 9 au résultat).
- La somme de tous les chiffres obtenus est effectuée.
- Le résultat est divisé par 10. Si le reste de la division est égal à zéro, alors le nombre original est valide.
Voici ce que j’ai tenté :
bool checksum(std::vector<unsigned>);
int main()
{
std::vector<unsigned> sequence{ 5, 2, 0, 5, 5, 9, 7, 2, 3, 1, 1, 4, 7, 9, 0, 8 };
if (checksum(sequence))
std::cout << "The credit card is valid." << std::endl;
else
std::cout << "The credit card is not valid." << std::endl;
}
bool checksum(std::vector<unsigned> seq)
{
for (auto it{ seq.rbegin() }; it != seq.rend(); it += 2) {
*it *= 2;
if (*it > 9) *it -= 9;
}
return std::accumulate(seq.begin(), seq.end(), 0) % 10 == 0;
}
Mon problème est que je ne respecte pas la condition "en commençant par l’avant dernier" car je ne vois pas comment le faire en utilisant les itérateurs. Ce qui implique que ma fonction me retourne un résultat erroné.
Comment parcourir une collection en partant de l’avant dernier élément ?
Merci pour votre aide !