2015-07-19 74 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的答案! –