Created
April 24, 2020 20:22
-
-
Save ianjmacintosh/0e3c427816d2d7b36bd31975de4dd346 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