2015-07-19 72 views
0

我遇到了一個我正在爲學校寫的程序的問題。我需要使用Luhn算法驗證信用卡號碼,但是我在獲取算法邏輯正常工作方面遇到了一些困難。我相信我知道問題出在哪裏,但我無法修復它。Luhn算法不起作用

我相信這個問題是在這裏:

For i = 0 To cardInput.Text.Length - 2 Step -2 
    Dim x = (i * 2) 
    If x > 9 Then 
     x = x - 9 
    End If 
    oddTotal += x 
Next 

'Sum of undoubled digits 
For i = 0 To cardLength - 1 Step -2 
    evenTotal += i 
Next 

total = oddTotal + evenTotal 

checkSum = total 

infoOutput.Items.Add("CheckDigit: " & checkDigit) 
infoOutput.Items.Add("CheckSum :" & checkSum) 

'Verify that the card is valid by the Mod 10 (Lund algoritm) 
If checkSum = checkDigit Or checkSum = 0 Then 
    valid = True 
Else 
    valid = False 
End If 

如果它的需要,我的項目的其餘部分可以看出here

我的代碼似乎並沒有啓動在了最後一位,採取一切其他數字回到起點翻倍。 Step -2運算符在這裏不正確嗎?我究竟做錯了什麼?

+1

你似乎沒有使用該卡號碼數字。 –

+0

我不明白我是如何,但如果我使用此代碼來顯示選定的數字,它顯示罰款在我的列表框。 infoOutput.Items.Add(cardInput.Text.Substring(cardLength -2,1)) 所以我的For循環應該選擇數字並利用它們是正確的? –

回答

1

這裏有幾個問題。特別是:

如果你想循環倒數,你必須從較高的索引開始,並在較低的索引結束。所以:

For i = cardInput.Text.Length - 2 To 0 Step -2 

然後,而不是直接使用i,你應該使用i -Ith位:

Dim x = Val(cardInput.Text(i)) 

這同樣適用於你的脣上的總和。

如果要檢查最後一個數字是零,使用Mod操作:

valid = (checkSum Mod 10 = 0) 
+0

非常感謝!我沒有意識到,我退後一步的方式不會產生與輸入中的字符串相同的結果,並且當我玩各種其他物品時,我忘了將Mod 10放回去。 +1的答案! –