2011-10-07 31 views
1

我試圖用這段代碼來測試示例代碼是否是有效的信用卡號(在Luhn algorithm中)。我哪裏做錯了?它需要16個一位數字的數組。任何幫助將非常感激。謝謝!我的Luhn算法代碼有什麼問題?

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); 
} 
+3

是什麼讓你覺得你錯了?你有錯誤嗎?意外的結果?請添加詳細信息,並獲得輸出 – Guillaume

回答

6

您的代碼是正確的,除非您以錯誤的替代數字開頭。更改爲:

boolean alternateNum = false; 
+0

你更快:)看起來這是真正的原因。 – Lyth

5

Wikipedia article --you've來看錯過了一個校驗和數字或它錯誤考慮account--。

更新:最有可能的是,您已經開始了一個錯誤的「備用」標誌。

有一個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; 
    } 
1

交替位數字翻了一番,從不是開始計數。

而不是使用您的alternateNum布爾試試這個。

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