1

我正在尝试使用此代码来测试示例代码是否是 Java 中的有效信用卡号(使用Luhn 算法)。我哪里做错了?它接收一个由 16 个一位数组成的数组。任何帮助将非常感激。谢谢!

private static boolean isValidCC(int[] number) {
    int sum = 0;
    boolean alternateNum = true;
    for (int i = number.length-1; i>=0; i--) {
        int n = number[i];
        if (alternateNum) {
            n *= 2;
            if (n > 9) {
                n = (n % 10) + 1;
            }
        }
        sum += n;
        alternateNum = !alternateNum;
    }
    System.out.println(sum);
    return (sum % 10 == 0);
}
4

3 回答 3

6

您的代码是正确的,只是您以错误的备用数字开头。改成:

boolean alternateNum = false;
于 2011-10-07T13:14:49.137 回答
5

维基百科的文章来看——你错过了一个校验和数字或错误地考虑了它——。

更新:很可能,您从错误的“替代”标志开始。

有一个 Java 代码片段,那么为什么不使用它呢?

  public static boolean isValidCC(String number) {

    final int[][] sumTable = {{0,1,2,3,4,5,6,7,8,9},{0,2,4,6,8,1,3,5,7,9}};
    int sum = 0, flip = 0;

    for (int i = number.length() - 1; i >= 0; i--) {
      sum += sumTable[flip++ & 0x1][Character.digit(number.charAt(i), 10)];
    }
    return sum % 10 == 0;
  }
于 2011-10-07T13:10:14.850 回答
1

交替数字从末尾而不是开头计数加倍。

而不是使用你的alternateNumbool 试试这个。

if((number.length - i) % 2 == 0){
    n *= 2;
    ...
}
于 2011-10-07T13:29:35.310 回答