0
  • 第 1 步:将卡号从右数第二位开始的交替数字的值加倍。
  • 步骤 2:将步骤 1 中获得的单个数字与原始数字中的每个未受影响的数字相加。
  • 第三步:如果第二步得到的总和能被10整除,则卡号有效,否则无效。

例如,使用 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

第三步:70能被10整除⇒卡号有效

这是问题的第二部分。所以我将卡号用户输入作为字符串。这是否意味着我必须 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);

        }
4

3 回答 3

1

几点建议:

  • 你应该从数字序列的右端开始向左工作信用卡号中的最后一位数字(如果是校验位)。有些信用卡的位数是奇数,有些信用卡的位数是偶数。从字符串的“右”端开始是确保将正确数字加倍的一种方法。
  • 一些信用卡使用奇数位数的事实意味着您不能依赖能够在每个循环中处理两个字符(至少在没有对该奇数剩余字符进行特殊情况处理的情况下并非如此)。
  • 当您加倍一位数字时,如果您最终得到大于 10 的结果,您希望在将其折叠到校验和之前从结果中减去 9(有效地将两位数相加)。
于 2012-08-18T21:55:49.730 回答
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 算法从右端开始,然后每隔一个数字乘以 2 并添加结果。

  1. 在上面的代码中,我使用Integer.parseInt(str.substring(idx,idx+1))从字符串中获取每个数字。如果不是数字,则会抛出错误。
  2. 在那里我检查alt- 标志,如果它是真的,我将值乘以 2。如果结果大于 9,我减去 9。这与添加 1+[0-8] 的结果相同。
  3. 我将值添加到总和并切换alt- 标志。
  4. 如果总和能被 10 整除,则结果为真。
于 2012-08-18T22:12:28.227 回答
-1

我试图编写代码来做我猜你想要的:

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]; 
}

您遇到了麻烦,因为您将 a 分配给charan 中的一个位置int[],因此使用了 的 int 表示char。因此,调用digitsChar[2]不会失败(它总是应该失败,因为任何数字的 double 永远不能超过两位,其中一半只有一个),因为 doubleint的 digit chars 的表示都有三个数字.

于 2012-08-18T23:37:08.117 回答