Home > Enterprise >  Sum up digits for Luhns algorithm in c
Sum up digits for Luhns algorithm in c

Time:07-24

I'm trying to sum up all of the multiplied digits but I have no idea how to implement it. At the moment it prints 0 1 2 0 1 0 1 0 1 0 1 2 8 0 0 0 0 0 0 0 0.

void get_digit(long credit_num, long n)
{
    int sum = 0;
    credit_num = ((credit_num / n) % 10) * 2;
    while(credit_num > 9) //do till num greater than  0
    {
        //int mod
        int splitDigit = credit_num % 10;
        printf("%d ", sum); //print the digit.
        sum = sum splitDigit;

        credit_num = credit_num / 10;
    }

    printf("%li ", credit_num);
}

long check_sum(long credit_num, int creditLength)
{
    bool valid = false;
    long n = 10;

    //Gets digit in number
    for (int i = 0; i < creditLength; i  )
    {
        get_digit(credit_num, n);
        n*=100;
    }

    return credit_num;
}

CodePudding user response:

I would store the credit card number in a string instead. If that's not wanted, you can convert it to a string for the purpose of calculating the luhn check digit.

Example:

#include <ctype.h>
#include <stdio.h>
#include <string.h>

// An example impl. calculating the luhn check digit using a string.
// Replace with your own if this doesn't appeal to you.
int luhn(const char *str)
{
    static const int add[2][10] = {{0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
                                   {0, 2, 4, 6, 8, 1, 3, 5, 7, 9}};
    int sum = 0;
    
    for (unsigned i = strlen(str), a = 1; i-- > 0; a = (a   1) % 2) {
        if (!isdigit((unsigned char)str[i])) return -1;
        sum  = add[a][str[i] - '0'];
    }
    
    return 10 - (sum % 10);
}

int check_sum(long credit_num)
{
    // convert credit_num to a string first:
    char buf[20];
    int len = snprintf(buf, sizeof buf, "%ld", credit_num);
    if(len >= sizeof buf) return -1;

    return luhn(buf); // and call the luhn function
}

int main()
{
    printf("%d\n", check_sum(7992739871)); // prints 3
}
  • Related