# Credit Card Checker Problem

unknown
c_cpp
a year ago
2.7 kB
1
Indexable
Never
```#include <iostream> // For cin and cout
#include <cmath> // For power function
using namespace std; // Using standard library

// Prototypes
int len_int(long long n);
int get_index(long long n, int i);

int main()
{
long long number;

// Digit Check
// At the moment, the program assumes the user is inputting numbers only (no characters, symbols, etc.)
// This program can be improved to handle the case where the user inputs something else, or nothing.
do
{
cout << "Number: ";
cin >> number;
} while ((number <= 999999999999 || number >= 10000000000000000) || (number > 9999999999999 && number < 100000000000000));
// ^^ Also could use the len_int() function I introduced later in the code.

// Luhn's Algorithm
// First sum (Multiplying by 2 and adding)
int first_sum = 0;
for (int i = (len_int(number) - 2); i > -1; i = i - 2)
{
int n = get_index(number, i);
n = n * 2;
if (len_int(n) == 2)
{
n = get_index(n, 0) + get_index(n, 1);
}
first_sum += n;
}

// Second sum (Just adding the rest of the digits)
int second_sum = 0;
for (int i = (len_int(number) - 1); i > -1; i = i - 2)
{
second_sum += get_index(number, i);
}

// Final sum and checking for cases
int final_sum = first_sum + second_sum;
if ((final_sum % 10) == 0)
{
// Since lines are long, it is more readable to put them in nesting 'if' conditions rather than at one line.
// However, for the sake of avoiding confusion, I put them in the same line.
// VISA condition
if ((len_int(number) == 13 || len_int(number) == 16) && (get_index(number, 0) == 4))
{
cout << "VISA\n";
}
// American Express Condition
else if ((len_int(number) == 15) && (get_index(number, 0) == 3 && (get_index(number, 1) == 4 || get_index(number, 1) == 7)))
{
cout << "AMEX\n";
}
// Mastercard Condition
else if ((len_int(number) == 16) && (get_index(number, 0) == 5 && (get_index(number, 1) > 0 && get_index(number, 1) < 6)))
{
cout << "Mastercard\n";
}
else
{
cout << "INVALID\n";
}
return 0;
}
else {
cout << "INVALID\n";
return 0;
}

}

// Takes in a 8-byte int (long long) and an index for the int, and returns a single-digit number
// back as if the integer is an array of single-digit numbers. The integer is zero-indexed.
int get_index(long long n, int i)
{
int power_of_ten = len_int(n) - i - 1;
n = n / pow(10, power_of_ten);
n = n % 10;
int result = n;
return result;
}

// Returns the length of an int (or long long)
int len_int(long long n)
{
int length = 0;
while (n > 0)
{
n = n / 10;
length = length + 1;
}
return length;
}
```