【问题标题】:Luhn Algorithm not working卢恩算法不起作用
【发布时间】:2015-07-19 17:24:35
【问题描述】:

我在为学校编写的程序中遇到了问题。我需要使用 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 运算符在这里不正确吗?我做错了什么?

【问题讨论】:

  • 您似乎没有使用卡号的数字。
  • 我不明白我是怎么做到的,但如果我使用此代码显示所选数字,它在我的列表框中显示良好。 infoOutput.Items.Add(cardInput.Text.Substring(cardLength -2,1)) 所以我的 For 循环应该选择数字并正确使用它们?

标签: vb.net


【解决方案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)

【讨论】:

  • 非常感谢!我没有意识到以我原来的方式后退不会产生与在输入中反转字符串相同的结果,而且我在玩各种其他项目时忘记将 Mod 10 放回原处。为答案+1!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-31
  • 1970-01-01
  • 2012-09-09
  • 1970-01-01
  • 1970-01-01
  • 2015-07-19
  • 2017-08-10
相关资源
最近更新 更多