Created
May 29, 2020 00:16
-
-
Save ianjmacintosh/c645a70f7b8b79a3b76e05c789cc4e70 to your computer and use it in GitHub Desktop.
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 <cs50.h> | |
| #include <stdio.h> | |
| int getLength(long n); | |
| long getTens(int distanceFromRight); | |
| int getDigit(long n, int s); | |
| bool isValid(long n); | |
| int main(void) | |
| { | |
| double cardNumber = 0; | |
| int length = 0; | |
| cardNumber = get_double("Number: "); | |
| length = getLength(cardNumber); | |
| if (isValid(cardNumber) == true) | |
| { | |
| // AMEX: Starts with 34 or 37 && is 15 digits long | |
| if (length == 15 && getDigit(cardNumber, 15) == 3 && (getDigit(cardNumber, 14) == 4 || getDigit(cardNumber, 14) == 7)) | |
| { | |
| printf("AMEX\n"); | |
| } | |
| // MASTERCARD: Starts with 51, 52, 53, 54, or 55 && is 16 digits long | |
| else if (length == 16 && getDigit(cardNumber, 16) == 5 && getDigit(cardNumber, 15) > 0 && getDigit(cardNumber, 15) < 6) | |
| { | |
| printf("MASTERCARD\n"); | |
| } | |
| // VISA: Starts with 4 && is 13 or 16 digits long | |
| else if ((length == 13 && getDigit(cardNumber, 13) == 4) || (length == 16 && getDigit(cardNumber, 16) == 4)) | |
| { | |
| printf("VISA\n"); | |
| } | |
| // Otherwise, it's invalid | |
| else | |
| { | |
| printf("INVALID\n"); | |
| } | |
| } | |
| else | |
| { | |
| printf("INVALID\n"); | |
| } | |
| } | |
| long getTens(int distanceFromRight) | |
| { | |
| long number = 1; | |
| for (int i = 0; i < distanceFromRight; i++) | |
| { | |
| number *= 10; | |
| } | |
| return number; | |
| } | |
| int getDigit(long n, int s) | |
| { | |
| return (n % getTens(s) - n % getTens(s - 1)) / getTens(s - 1); | |
| } | |
| bool isValid(long n) | |
| { | |
| int evenDigitsSum = 0; | |
| int oddDigitsSum = 0; | |
| int length = getLength(n); | |
| int lastDigit = 1; | |
| bool valid = false; | |
| // Add all the even numbers | |
| for (int i = 2; i <= length; i += 2) | |
| { | |
| int newDigit = getDigit(n, i) * 2; | |
| // printf("New digit (to parse): %d\n", getDigit(n, i)); | |
| if (newDigit > 9) | |
| { | |
| // printf("New digit (to add): %d\n", getDigit(newDigit, i) * 2); | |
| newDigit = getDigit(newDigit, 1) + getDigit(newDigit, 2); | |
| } | |
| // printf("New digit (added): %d\n", newDigit); | |
| evenDigitsSum += newDigit; | |
| } | |
| // Add all the odd numbers | |
| for (int i = 1; i <= length; i += 2) | |
| { | |
| int newDigit = getDigit(n, i); | |
| oddDigitsSum += newDigit; | |
| } | |
| lastDigit = getDigit(oddDigitsSum + evenDigitsSum, 1); | |
| if (getDigit(oddDigitsSum + evenDigitsSum, 1) == 0) | |
| { | |
| valid = true; | |
| } | |
| return valid; | |
| } | |
| int getLength(long n) | |
| { | |
| int length = 0; | |
| // Must be 13, 15, or 16 digits long! | |
| if (n >= 1000000000000 && n <= 9999999999999) | |
| { | |
| length = 13; | |
| } | |
| else if (n >= 100000000000000 && n <= 999999999999999) | |
| { | |
| length = 15; | |
| } | |
| else if (n >= 1000000000000000 && n <= 9999999999999999) | |
| { | |
| length = 16; | |
| } | |
| return length; | |
| } | |
| // Test method | |
| // int main(void) | |
| // { | |
| // long n = 1234567890123456; | |
| // long s = 10000000000000000; | |
| // printf("%ld", getDigit(n, 15)); | |
| // printf("%ld", getDigit(n, 14)); | |
| // } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment