Created
April 12, 2019 03:06
-
-
Save mayomi1/391744070055a4f34804e28648f78494 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
import java.util.Scanner; | |
public class CardChecker { | |
/** Main Method */ | |
public static void main(String[] args) { | |
Scanner input = new Scanner(System.in); // Create a Scanner | |
// Prompt the user to enter a credit card number as a long integer | |
System.out.print("Enter a credit card number as a long integer: "); | |
long cardNumber = input.nextLong(); | |
System.out.println( | |
cardNumber + " is " + (isValid(cardNumber) ? "valid" : "invalid")); | |
} | |
/** Return true if the card number is valid */ | |
public static boolean isValid(long number) { | |
if(getSize(number) >= 13 && getSize(number) <= 16) { | |
if(prefixMatched(number, 4) || prefixMatched(number, 5) || | |
prefixMatched(number, 37) || prefixMatched(number, 6)) { | |
int sumOfDouble = sumOfDoubleEvenPlace(number); | |
int sumOfOdd = sumOfOddPlace(number); | |
// if the sum is divisible by 10 | |
if((sumOfDouble + sumOfOdd) % 10 == 0) { | |
return true; | |
} | |
} | |
} | |
return false; | |
} | |
/** Get the result from Step 2 */ | |
public static int sumOfDoubleEvenPlace(long number) { | |
int sum = 0; | |
String num = number + ""; | |
for (int i = getSize(number) - 2; i >= 0; i -= 2) { | |
sum += getDigit(Integer.parseInt(num.charAt(i) + "") * 2); | |
} | |
return sum; | |
} | |
/** Return this number if it is a single digit, otherwise, | |
* return the sum of the two digits */ | |
public static int getDigit(int number) { | |
if (number >= 10) | |
return number / 10 + number % 10; | |
else | |
return number; | |
} | |
/** Return sum of odd-place digits in number */ | |
public static int sumOfOddPlace(long number) { | |
int sum = 0; | |
String num = number + ""; | |
for (int i = getSize(number) - 1; i >= 0; i -= 2) { | |
sum += Integer.parseInt(num.charAt(i) + ""); | |
} | |
return sum; | |
} | |
/** Return true if the digit d is a prefix for number */ | |
public static boolean prefixMatched(long number, int d) { | |
return getPrefix(number, getSize(d)) == d; | |
} | |
/** Return the number of digits in d */ | |
public static int getSize(long d) { | |
String num = d + ""; | |
return num.length(); | |
} | |
/** Return the first k number of digits from number. If the | |
* number of digits in number is less than k, return number. */ | |
public static long getPrefix(long number, int k) { | |
if (getSize(number) > k) { | |
String num = number + ""; | |
return Long.parseLong(num.substring(0, k)); | |
} | |
return number; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment