我对以下编程作业有疑问。
信用卡号码遵循某些模式。信用卡必须有 13 到 16 位数字。它必须以:
• 4 个 Visa 卡
• 5 个主卡
• 美国运通卡 37
1954 年,IBM 的 Hans Luhn 提出了一种验证信用卡号码的算法。该算法可用于确定卡号是否正确输入或信用卡是否被扫描仪正确扫描。几乎所有的信用卡号码都是在这个有效性检查之后生成的,通常称为 Luhn 检查或 Modulus 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
如果 step 的结果能被 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. ");
}
}
}
我的问题是如何使用数组来存储信用卡号而不是使用长号。