gpt4 book ai didi

c# - 编写 Luhn 算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:58:42 26 4
gpt4 key购买 nike

我有一个 luhn 算法,我正在尝试按照维基百科上的算法步骤进行操作,并且它适用于他们提供的示例。我认为这是正确的。但它不适用于我的任何个人卡。也没有我在寻找解决方案时发现的任何测试值。

我已经看到使用 lamba 和内联 linq 的其他解决方案。但我不想复制和粘贴任何东西。我宁愿真正理解我在编码什么。

49927398716      pass
49927398717 fail
1234567812345678 fail
1234567812345670 pass (mine fails this one)

我的代码如下。

    private bool CalculateLuhnAlgorithm()
{
string newListOfNumbers = this._number; //this._number is a string
int sumOfAllValues = 0;
if (_cardType != CardType.Unavailable)
{
//odd numbers minus the check Digit.
for (int i = this._number.Length - 2; i > 0; i -= 2)
{
int number = (int)char.GetNumericValue(this._number[i]) * 2;
if (number >= 10)
{
string concatinatedNumber = number.ToString();
int firstNumber = (int)char.GetNumericValue(concatinatedNumber[0]);
int secondNumber = (int)char.GetNumericValue(concatinatedNumber[1]);
number = firstNumber + secondNumber;
}
newListOfNumbers = newListOfNumbers.Remove(i, 1);
newListOfNumbers = newListOfNumbers.Insert(i, number.ToString());
}

// add up the complete total
foreach (char c in newListOfNumbers)
{
sumOfAllValues += (int)char.GetNumericValue(c);
}

}

// get the luhn validity
return (sumOfAllValues %10) == 0;
}

最佳答案

问题是您的 for 循环在 i > 0 时继续。这意味着您永远不会将第一个数字加倍。它应该在 i >= 0 时继续。

现在这里有一些其他的建议。

当您将 number 加倍并且它大于 10 时,您可以这样做

if(number > 10)
number = (number % 10) + 1;

这是有效的,因为最高的单个数字值 (9) 加倍是 (18)。所以第一位数字始终为 1,您只需将数字乘以 10 即可获得第二位数字。

您应该添加一个检查以确保该字符串具有偶数位数,并且可能根据您使用的帐号是特定的下限和上限。

与其创建第二个包含“奇数”数字加倍的字符串,不如在遍历数字时跟踪总和,如下所示。

private bool CalculateLuhnAlgorithm()
{
if(this.number.Length % 2 != 0)
return false; // Or maybe throw an exception?
if (_cardType != CardType.Unavailable)
{
int sumOfAllValues = 0;
//odd numbers minus the check Digit.
for (int i = 0; i < this._number.Length; i++)
{
if(i%2 != 0) // because i is 0 based instead of 1 based.
sumOfAllValues += (int)char.GetNumericValue(this._number[i])
else
{
int number = (int)char.GetNumericValue(this._number[i]) * 2;
if (number >= 10)
{
number = (number % 10) + 1;
}
sumOfAllValues += number;
}
}

// get the luhn validity
return (sumOfAllValues %10) == 0;
}
else
{
// Not completely sure what this should do,
// but in your code it just results in true.
return true;
}
}

最后,您可能希望将 char.GetNumericValue 替换为 int.TryParse,这样您就可以验证包含非数字值的字符串。 char.GetNumericValue 对于非数字值返回 -1。

int digit = 0;
if(!int.TryParse(this._number.SubString(i, 1), out digit)
{
return false; // Or throw an exception.
}

关于c# - 编写 Luhn 算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27844654/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com