Skip to content

Instantly share code, notes, and snippets.

@ianjmacintosh
Created April 24, 2020 20:22
Show Gist options
  • Select an option

  • Save ianjmacintosh/0e3c427816d2d7b36bd31975de4dd346 to your computer and use it in GitHub Desktop.

Select an option

Save ianjmacintosh/0e3c427816d2d7b36bd31975de4dd346 to your computer and use it in GitHub Desktop.
#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