E.g。使用Mod 10算法验证VISA卡49977393716的卡号:
第1步:
4 9 9 7 7 3 9 3 7 1 6
x2 x2 x2 x2 x2
= 18 14 6 6 2
第2步:4 + (1+8) + 9 + (1+4) + 7 + (6) + 9 + (6) + 7 + (2) + 6 = 70
步骤3:70可被10整除⇒卡号有效
这是问题的第二部分。所以我将cardnumber userInput作为String。这是否意味着我必须charAt(),想要的字符//替代值。
int[] digits = new int[cardNo.length()/2];//Number of alternate values available
char digit1;
char digit2;
int intDigit1;
int intDigit2;
int[] sumOfTwoDigits = new int[cardNo.length()/2];
int totalSum;
String digitsChar;
for(int i=0; i<digits.length; i++){
digits[i]=(cardNo.charAt(i+1))*2;
digitsChar=Integer.toString(digits[i]);
digit1= digitsChar.charAt(1);
digit2= digitsChar.charAt(2);
intDigit1= Character.getNumericValue(digit1);//Convert char to int to perform addition
intDigit2= Character.getNumericValue(digit2);//Convert char to int to perform addition
sumOfTwoDigits[i] = intDigit1+intDigit2;
System.out.println("digits: " + intDigit1);
}
答案 0 :(得分:1)
一些指示:
答案 1 :(得分:0)
我的java有点生疏,但我们走了:
public static boolean luhnVerify(String str) {
int sum = 0;
int value;
int idx = str.length(); // Start from the end of string
boolean alt = false;
while(idx-- > 0) {
// Get value. Throws error if it isn't a digit
value = Integer.parseInt(str.substring(idx, idx + 1));
if (alt) {
value *= 2;
if (value > 9) value -= 9;
}
sum += value;
alt = !alt; //Toggle alt-flag
}
return (sum % 10) == 0;
}
Luhn algorithm从右端开始,然后将每个其他数字乘以2并添加结果。
Integer.parseInt(str.substring(idx,idx+1))
来获取字符串中的每个数字。如果它不是数字,则会抛出错误。alt
- 标志,如果是真,我将该值乘以2.如果结果大于9,则减去9.这与加1+ [0-8]的结果相同] alt
- 标志。答案 2 :(得分:0)
我曾尝试编写符合我的意思的代码:
String cardNo = "49977393716";
int[] digits = new int[cardNo.length()/2]; //Number of alternate values available
int[] sumOfTwoDigits = new int[cardNo.length()/2];
for(int i=0; i<digits.length; i++){
//get the numeric value of the char, instead of the int representation
digits[i]=Character.getNumericValue(cardNo.charAt(2*i+1))*2;
//using Michael Burr's trick
sumOfTwoDigits[i] = digits[i] >= 10 ? digits[i] - 9 : digits[i];
}
您遇到了麻烦,因为您为char
中的某个职位分配了int[]
,因此使用了char
的int表示形式。因此,对digitsChar[2]
的调用没有失败(它总是应该失败,因为任何数字的两倍都不能超过两位数,而其中一半只有一个),因为{{1}加倍数字int
的表示都有三位数。