我对以下编程任务有疑问.
信用卡号码遵循某些模式.信用卡必须在13到16位之间.它必须从:
•4张Visa卡
•5张万事达卡
•美国运通卡37张
1954年,IBM的Hans Luhn提出了一种验证信用卡号的算法.该算法可用于确定是否正确输入了卡号或扫描仪是否正确扫描了信用卡.几乎所有信用卡号都是在此有效性检查后生成的,通常称为Luhn检查或模数10检查,可以描述如下.例如,请考虑卡号4388576018402625.
>从右到左加倍每秒.如果数字加倍会产生2位数字,请将两位数相加以得到一位数字.
2 x 2 = 4
2 x 2 = 4
4 x 2 = 8
1 x 2 = 2
6 x 2 = 12(1 2 = 3)
5 x 2 = 10(1 0 = 1)
8 x 2 = 16(1 6 = 7)
4 x 2 = 8
>添加步骤1中的所有单个数字
4 4 8 2 3 1 7 8 = 37
>在卡号中从右到左添加奇数位的所有数字
5 6 0 8 0 7 8 3 = 37
>总结第2步和第3步的结果
37 37 = 74
>如果步骤的结果可被10整除,则卡号有效;否则,它无效.例如,号码4388576018402625无效,但号码4388576018410707是有效的Visa卡;号码6011000593748745无效,但号码6011000593748746是有效的Discover卡.
我尝试解决它,如下面的代码所示:
import java.util.Scanner;
public class CreditCardValidation {
public static boolean isValid(long number) {
int total = sumOfDoubleEvenPlace(number) + sumOfOddPlace(number);
if ((total % 10 == 0) && (prefixMatched(number, 1) == true) && (getSize(number)>=13 ) && (getSize(number)<=16 )) {
return true;
} else {
return false;
}
}
public static int getDigit(int number) {
if (number <= 9) {
return number;
} else {
int firstDigit = number % 10;
int secondDigit = (int) (number / 10);
return firstDigit + secondDigit;
}
}
public static int sumOfOddPlace(long number) {
int result = 0;
while (number > 0) {
result += (int) (number % 10);
number = number / 100;
}
return result;
}
public static int sumOfDoubleEvenPlace(long number) {
int result = 0;
long temp = 0;
while (number > 0) {
temp = number % 100;
result += getDigit((int) (temp / 10) * 2);
number = number / 100;
}
return result;
}
public static boolean prefixMatched(long number, int d) {
if ((getPrefix(number, d) == 4)
|| (getPrefix(number, d) == 5)
|| (getPrefix(number, d) == 3)) {
if (getPrefix(number, d) == 3) {
System.out.println("\nVisa Card ");
} else if (getPrefix(number, d) == 5) {
System.out.println("\nMaster Card ");
} else if (getPrefix(number, d) == 3) {
System.out.println("\nAmerican Express Card ");
}
return true;
} else {
return false;
}
}
public static int getSize(long d) {
int count = 0;
while (d > 0) {
d = d / 10;
count++;
}
return count;
}
public static long getPrefix(long number, int k) {
if (getSize(number) < k) {
return number;
} else {
int size = (int) getSize(number);
for (int i = 0; i < (size - k); i++) {
number = number / 10;
}
return number;
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("Enter a credit card number as a long integer: ");
long input = sc.nextLong();
if (isValid(input) == true) {
System.out.println("\n" + input + " is Valid. ");
} else {
System.out.println("\n" + input + " is Invalid. ");
}
}
}
我的问题是如何使用数组来存储信用卡号而不是使用长号码.