【问题标题】:What's wrong with my Luhn algorithm code?我的 Luhn 算法代码有什么问题?
【发布时间】:2023-04-25 01:14:02
【问题描述】:

我正在尝试使用此代码来测试示例代码是否是 Java 中的有效信用卡号(使用 Luhn algorithm)。我哪里做错了?它接受一个由 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);
}

【问题讨论】:

  • 是什么让您认为自己出错了?你有错误吗?出乎意料的结果?请添加详细信息,以及您得到的输出

标签: java checksum luhn


【解决方案1】:

末尾而不是开头开始,交替数字加倍。

不要使用alternateNum bool 试试这个。

if((number.length - i) % 2 == 0){
    n *= 2;
    ...
}

【讨论】:

    【解决方案2】:

    Wikipedia article 判断——你错过了校验和数字或错误地考虑了它——。

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

    有一个Java sn-p,为什么不用呢?

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

    【讨论】:

      【解决方案3】:

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

      boolean alternateNum = false;
      

      【讨论】:

      • 你更快 :) 看起来这才是真正的原因。