Created
July 31, 2017 03:57
-
-
Save robertbenjamin/8f2f93361a935b1f69faeace264e628d to your computer and use it in GitHub Desktop.
Validate a credit card using the Luhn formula.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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