commit a50f52d01c7b01d5505d62d4bc9cb5e8433e10b1 Author: bot50 Date: Wed Feb 21 21:09:23 2024 +0000 kukemuna-cs50/problems/2024/x/credit@20240221T210923.425481288Z diff --git a/credit.c b/credit.c new file mode 100644 index 0000000..2b617e1 --- /dev/null +++ b/credit.c @@ -0,0 +1,138 @@ +#include +#include + +// Prototypes +long long get_card_number(void); +void find_issuer(long long card_number); +int validate(long long card_number); +int get_id(long long card_number); +int get_length(long long card_number); + +int main(void) +{ + long long card_number = get_card_number(); + + if (validate(card_number)) + { + find_issuer(card_number); + } + return 0; +} + +long long get_card_number() +{ + long long number; + do + { + number = get_long("Insert card number: "); + } + while (number < 0); + + return number; +} + +void find_issuer(long long card_number) +{ + int id = get_id(card_number), count = get_length(card_number); + + // Number beginning with 34 or 37 and length is 15 + if ((id / 100 == 34 || id / 100 == 37) && count == 15) + { + printf("AMEX\n"); + return; + } + + // Number beginning with 4 and length is 13 or 16 + if ((id / 1000 == 4) && (count == 13 || count == 16)) + { + printf("VISA\n"); + return; + } + + // Number beginning with 51-55 or 2221-2720 and length is 16 + if (((id / 100 >= 51 && id / 100 <= 55) || (id >= 2221 && id <= 2720)) && count == 16) + { + printf("MASTERCARD\n"); + return; + } + else + { + printf("INVALID\n"); + return; + } +} + +int validate(long long card_number) +{ + // Add together individual digits while multiplying every other digit from one after least significant before addition + // If multiplication product is geater than 9 then add individual digits together. 3456 => 6 + (1 + 0) + 4 + 6 + int sum = 0, multiply = 0; + + while (card_number > 0) + { + if (multiply) + { + if (card_number % 10 * 2 > 9) // Is multiplication product greater than 9? + { + int n = card_number % 10 * 2; + while (n > 0) // If so, add individual digits to the sum + { + sum += n % 10; + n /= 10; + } + } + else + { + sum += card_number % 10 * 2; + } + card_number /= 10; + multiply = 0; + } + else + { + sum += card_number % 10; + card_number /= 10; + multiply = 1; + } + } + + if (sum % 10 != 0) + { + printf("INVALID\n"); + return 0; // Invalid number + } + else + { + return 1; // Valid number + } +} + +int get_id(long long card_number) +{ + int count = get_length(card_number), id; + long long n, trunc = 1; + + if (count < 13 || count > 16) + { + return 0; + } + + for (int i = 0; i < count - 4; i++) // Get four most significant digits + { + trunc *= 10; + } + id = card_number / trunc; + return id; +} + +int get_length(long long card_number) +{ + int count = 0; + + while (card_number > 0) + { + card_number /= 10; + count++; + } + return count; +}