- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个 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/
我想了解其中的逻辑,以便我可以在 java 中实现这个算法。我想计算有效的十六进制 IMEI 号码的校验位。例如 - 6C4BFFC0000004请帮我算法。我试图在谷歌中找到解决方案,但我无法使用这
enter image description here 谁能解释一下这个程序。这个程序是我们老师给出的,他说这是关于 luhn 算法的,我找到了它是什么,但我无法理解该程序。 最佳答案 读完维基百科
大家好,我是编程界的新手。对于学校练习题,我得到了以下文本,我想将其转换为代码。我已经花了几个小时在上面,但似乎仍然无法弄清楚,但我决心学习这个。我目前遇到错误 line 7, in if i
我对编程非常陌生。我根据以下说明实现了信用卡验证程序。 让输入成为输入。 反向输入。 将输入的所有奇数位置(即索引 1、3、5 等)乘以 2。如果这些相乘项中的任何一项大于 9,则减去 9。 将输入的
排除校验位,luhn 算法的最小长度是多少? 我的想法是,它适用于任何大于 2 位的数字(同样,不包括校验位)。 我问的原因是:如果我从右到左遍历数字中的所有数字。这会导致我的 luhn 验证中的 i
在我的应用程序中,我想检查用户是否输入了我使用 LUHN 算法的有效卡号。我已将其创建为方法并在主 Activity 中调用。但即使我提供有效的卡号,它也会显示无效。在输入卡号时,我在中间留了空格,我
一切看起来都很好,似乎遵循 Luhn 的算法,但是当我输入我自己的信用卡号或这个应该有效的样本号:4388576018410707 时,它仍然无效... 谁能找到问题所在? #include int
我正在尝试用 JAVA 制作一个应用程序来检查用户输入的信用卡号是否有效。 以下是模数 10 检查的步骤: 第一步:从右到左每隔两个数字加倍。如果数字加倍得到两位数,则将这两位数相加得到一位数。 第
我一直在试图找出验证信用卡的 Luhns 方法,但我似乎无法弄清楚。我需要使用方法而不能使用数组,所以我完全被难住了。 这是 Luhns 检查: 信用卡号必须包含 13 到 16 位数字。它必须从以下
它应该使用 luhn 检查来告诉我一张卡是有效还是无效4388576018402626 无效4388576018410707 有效但它一直告诉我一切都是无效的:/任何关于做什么或去哪里寻找的建议都会很
我昨天完成了将这些函数组合在一起,它基本上是 Luhn 算法的实现。第一个函数应该接受一个整数和数组作为输入,然后将整数拆分为数字以填充数组。第二个应该检查数字是否有效并返回 1 或 0。我的问题是,
我希望有人能帮助我解决这个问题。我是一个彻底的 C 新手。 这是关于 C 类(class)的学校作业(只是普通的旧 C,而不是 C# 或 C++),教授坚持认为我们唯一允许使用的编译器是 Borlan
我有这段代码,由于某些原因,我在 for 循环的每次迭代中都会得到一个非常大的数字,但我无法弄清楚其中的逻辑。 #include #include #include #include int
我使用以下脚本来验证在表单中输入的卡详细信息。我想为此添加一个功能,以便提醒使用激光卡的访客我们不接受它们。 Laser的起始数字是6304,6706,6771&6709 function Calcu
我正在尝试使用此代码在 Java 中测试示例代码是否为有效的信用卡号(使用 Luhn algorithm )。我哪里做错了?它接受一个由 16 个一位数组成的数组。任何帮助将非常感激。谢谢! priv
我试图让某人输入信用卡号并通过 Luhn Check 验证它是否有效。我希望能够检查他们是否将整个卡号作为一个大字符串输入,或者是否在其中放置了空格。在我的函数验证中,尽管我不断收到一条错误消息,指出
我编写了一个工作代码来使用 luhn 算法检查信用卡是否有效: class CreditCard def initialize(num) @@num_arr = num.to_s.spli
我有一个 luhn 算法,我正在尝试按照维基百科上的算法步骤进行操作,并且它适用于他们提供的示例。我认为这是正确的。但它不适用于我的任何个人卡。也没有我在寻找解决方案时发现的任何测试值。 我已经看到使
我是一名新的编程学生,我正在尝试用 Java 编写一个算法来执行以下操作: 计算信用卡号的每隔一个数字(从倒数第二个数字开始)并将每个数字乘以 2。 取结果整数并将所有数字加在一起(即,如果我得到 1
我正在尝试实现 Luhn 算法来检查信用卡号的有效性。为此,每隔一个数字需要乘以 2,如果结果 >9,则将其替换为数字之和。 def luhn_check(creditcardnr): """ che
我是一名优秀的程序员,十分优秀!