Search code examples
c++luhn

How should I approach a credit card number validation algorithm?


I'm writing a program to validate credit card numbers and I have to use Luhn's Algorithm. Let me say beforehand, that I have just started to learn to program (we covered loops like last week), so there a lot of things I am unfamiliar with. I am having trouble with one of my functions that checks the arithmetic. Basically, it has to double every second digit from right to left and add everything together. But if you double a number, like 5, and you get 10, then you will have to add 1+0=1 to the total sum instead of 10. That's the part I'm stuck on. How can I put that in a program?

Sample code so far:

int 
doubleEvenSum(string creditCardNumber) {
  int evenSum; 
  int countPosition; 
  int doublePosition; 
  int length;

  length = creditCardNumber.length (); 
  countPosition = creditCardNumber.at(length - 2); 
  evenSum = 0; 
  while(countPosition>0) { 
    if ((2 * countPosition) < 10) { 
      doublePosition = 2 * countPosition; 
    } 
    else if ((2 * countPosition) > 9) { 
      ??? 
    } 
    evenSum = evenSum + doublePosition; 
  }

Solution

  • #include <stdio.h>
    #include <string.h>
    #include <ctype.h>
    
    /*
        return the Luhn (MOD10) checksum for a sequence of digits.
    
        -1 is returned on error (a non-digit was in the sequence 
    
     */
    
    int mod10( char const* s)
    {
        int len = strlen(s);
        int sum = 0;
    
        int dbl = 0;
    
        while (len) {
            char digit;
            int val;
    
            --len;
            digit = s[len];
    
            if (!isdigit( (unsigned char) digit)) return -1;    // non digit in the sequence
    
            val = digit - '0';  // convert character to numeric value
    
            if (dbl) {
                // double the value
                val *= 2;
    
                // if the result is double-digits, add the digits together
                if (val > 9) {
                    val = val - 10;
                    val = val + 1;
                }
            }
    
            dbl = !dbl; // only double value every other time
    
            sum += val;
        }
    
        return sum % 10;
    }