Untitled

 avatar
unknown
csharp
2 years ago
2.7 kB
9
Indexable
#include <cs50.h>
#include <stdio.h>

// function to get digits count
int digits(long dig);

// function to get value of specific digit
int pos(long p, long card);

//function to check Luhn’s Algorithm
long check(long card);

// functions to get card type
bool visa(long card);
bool amex(long card);
bool mc(long card);

int main(void)
{
    long card = get_long("Number: ");

//checking if card type and checksum are both correct
    if (visa(card) == true && check(card) == 0)
    {
        printf("VISA\n");
    }
    else if (amex(card) == true && check(card) == 0)
    {
        printf("AMEX\n");
    }
    else if (mc(card) == true && check(card) == 0)
    {
        printf("MASTERCARD\n");
    }
    else
    {
        printf("INVALID\n");
    }
}

// checking how long is the input number
int digits(long dig)
{
    int d = 0;
    do
    {
        d++;
        dig = dig / 10;
    }
    while (dig != 0);
    return d;
}

// checking digit at specific position inside the number
int pos(long p, long card)
{
    int digit;
    long div = 10;
    for (int i = p; i > 1; i--)
    {
        div = div * 10;
    }
    digit = (card / (div / 10)) - ((card / div) * 10);
    return digit;
}

// checking first digits for the card type
bool visa(long card)
{
    if (digits(card) == 13 || digits(card) == 16)
    {
        if (pos(digits(card), card) == 4)
        {
            return true;
        }

    }
    return false;
}

// checking first digits for the card type
bool amex(long card)
{
    if (digits(card) == 15 && pos(15, card) == 3)
    {
        if (pos(14, card) == 4 || pos(14, card) == 7)
        {
            return true;
        }
    }
    return false;
}

// checking first digits for the card type
bool mc(long card)
{
    if (digits(card) == 16 && pos(16, card) == 5)
    {
        if (pos(15, card) > 0 && pos(15, card) < 6)
        {
            return true;
        }
    }
    return false;
}

//function to check Luhn’s Algorithm
long check(long card)
{
    long sd = 0;
    long se = 0;
    long check;
    // doubling every other digit
    for (int j = 2; j <= digits(card); j = j + 2)
    {
        // checking if result is two digit number and adding them up if
        if ((2 * pos(j, card)) > 9)
        {
            sd = sd + (2 * pos(j, card)) - 9;
        }
        else
        {
            sd = sd + (2 * pos(j, card));
        }
    }
    // adding the rest of the digits
    for (int k = 1; k <= digits(card); k = k + 2)
    {
        se = se + pos(k, card);
    }

    check = pos(1, sd + se);
    return check;
}
Editor is loading...