1

このコードを使用して、サンプル コードが有効なクレジット カード番号であるかどうかを ( Luhn アルゴリズムを使用して) Java でテストしようとしています。どこで私は間違えましたか?16 個の 1 桁の数字の配列を受け取ります。どんな助けでも大歓迎です。ありがとう!

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

交互の数字は、最初ではなく最後から数えて 2 倍になります。

alternateNumboolを使用する代わりに、これを試してください。

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