Pour faire suite à mes posts Algorithme de Luhn – Implémentation C++ et
Algorithme de Luhn – Implémentation C#, voici une version de l’agorithme implémenté en C.

Dans la solution que je propose ci-dessous, je suis arrivé au résultat suivant :

  • le code comptabilisé est constitué des 68 caractères significatifs de la suite d’instructions :
    int s=0,i=16,v;while(i–)v=*l++-’0′<<i%2,s+=v-9*(v>9);return s%10<1;
  • le temps d’exécution mesuré pour 1000000 itérations est de 0,16 secondes sur un Intel Core 2 Duo cadencé à 2,13 Ghz sous Ubuntu 9.04. Le code a été compilé par gcc 4.3.3 sans option.

Si vous avez des commentaires, des suggestions ou si vous avez une solution plus compacte ou plus rapide, n’hésitez pas à m’en faire part.

#include "stdio.h"
#include "time.h"   

int luhn( char* l )
{
    // début du code comptabilisé 

    int s = 0, i = 16, v; 

    while ( i-- )
         v = *l++ - '0' << i % 2,
         s += v - 9 * ( v > 9 ); 

    return s % 10 < 1; 

    // fin du code comptabilisé
}   

int main(int argc, char* argv[])
{
    clock_t start = clock();

    // début du temps d'exécution mesuré

    unsigned long l = 1000000L; 

    while ( l-- )
        luhn( "4970100000300521" );

    // fin du temps d'exécution mesuré   

    clock_t end = clock(); 

    printf( "Le temps d'exécution de la fonction est de %.2f secondes.\n", (float) ( end - start ) / (float) CLOCKS_PER_SEC ); 

    return 0;
}