Skip to content

Instantly share code, notes, and snippets.

@robertbenjamin
Created July 31, 2017 03:57
Show Gist options
  • Save robertbenjamin/8f2f93361a935b1f69faeace264e628d to your computer and use it in GitHub Desktop.
Save robertbenjamin/8f2f93361a935b1f69faeace264e628d to your computer and use it in GitHub Desktop.
Validate a credit card using the Luhn formula.
#include <stdio.h>
#include <cs50.h>
#include <math.h>
long get_number();
int get_number_length(long number);
int get_sum_of_digits(long number);
long get_first_n_digits(long number, int n);
bool validate_number(long number, long number_length);
int main(void) {
long number = get_number();
long number_length = get_number_length(number);
bool valid = validate_number(number, number_length);
if (!valid) {
printf("INVALID\n");
} else {
long first_digit = get_first_n_digits(number, 1);
long first_two_digits = get_first_n_digits(number, 2);
switch(number_length) {
case 15:
if (first_two_digits == 34 || first_two_digits == 37) {
printf("AMEX\n");
} else {
printf("INVALID\n");
}
break;
case 16:
if (first_digit == 4) {
printf("VISA\n");
} else {
switch(first_two_digits) {
case 51:
case 52:
case 53:
case 54:
case 55:
printf("MASTERCARD\n");
break;
default:
printf("INVALID\n");
}
}
break;
case 13:
if (first_digit == 4) {
printf("VISA\n");
} else {
printf("INVALID\n");
}
break;
default:
printf("INVALID\n");
break;
}
}
}
long get_number() {
printf("Number: ");
long number = get_long_long();
if (number > 0 && 13 <= get_number_length(number) && get_number_length(number) <= 16) {
return number;
} else {
printf("INVALID\n");
exit(0);
}
}
int get_number_length(long number) {
int i;
for (i = 0; number != 0; i++, number = number / 10){};
return i;
}
int get_sum_of_digits(long number) {
int sum = 0;
int number_length = get_number_length(number);
for (int i = 0; i < number_length; i++) {
long modulo_divider = pow(10, i);
long current_digit = (number / modulo_divider) % 10;
sum += current_digit;
}
return sum;
}
long get_first_n_digits(long number, int n) {
long divider = pow(10, n);
if (number < divider) {
return number;
}
return get_first_n_digits(number / 10, n);
}
bool validate_number(long number, long number_length) {
long even_numbers_sum = 0;
long odd_numbers_sum = 0;
for (int i = 0; i < number_length; i++) {
int counter = i + 1;
long modulo_divider = pow(10, i);
long current_number = (number / modulo_divider) % 10;
if (counter % 2 == 0) {
int temporary_number = current_number * 2;
even_numbers_sum += get_sum_of_digits(temporary_number);
} else {
odd_numbers_sum += current_number;
}
}
long final_sum = even_numbers_sum + odd_numbers_sum;
return final_sum % 10 == 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment