这种算法主要用于验证身份识别码的正确性,比如信用卡号、发卡行识别码、国际移动设备识别码(IMEI)、美国国家提供商标识号码以及电子票的票号验证等。是由IBM科学家Hans Peter Luhn于1954年发明的一种简单校验和算法。在工业自动化领域也有使用,它能确保条形码数据的有效性和准确性,比如出入库跟踪,自动化分拣上。
其工作原理是通过一系列数学运算来检测输入序列是否符合特定的模式。具体来说,Luhn算法的步骤如下:
-
从输入序列的最后一个字符开始,如果是偶数位上的数字,则将其乘以2;如果结果是一个两位数,则将这两个数字相加得到单个数字。
-
将所有处理过的数字加在一起得到总和。
-
最后,判断这个总和是否能被10整除。如果能被10整除,则说明输入序列通过了Luhn算法的校验,被认为是有效的。
由于该算法的最终目的是看总和是否能被10整除,因此也被称作“模10”算法。
用C++实现一下Luhn算法,用于验证信用卡号、IMEI、银行账户和电子票务系统的有效性:
#include <iostream>
#include <string>bool luhnCheck(const std::string& number) {int sum = 0;bool alternate = false;for (int i = number.length() - 1; i >= 0; --i) {if (!isdigit(number[i])) {return false;}int n = number[i] - '0';if (alternate) {n *= 2;if (n > 9) {n = (n % 10) + 1;}}sum += n;alternate = !alternate;}return (sum % 10) == 0;
}int main() {std::string number;std::cout << "Enter a number to check: ";std::cin >> number;if (luhnCheck(number)) {std::cout << "The number is valid according to the Luhn algorithm." << std::endl;} else {std::cout << "The number is not valid according to the Luhn algorithm." << std::endl;}return 0;
}
luhnCheck
函数接受一个字符串参数,表示要检查的数字。函数首先初始化一个累加器sum
和一个布尔变量alternate
,用于跟踪当前处理的数字是否应该翻倍。然后,函数从字符串的末尾开始遍历每个字符,跳过非数字字符,并将每个数字字符转换为整数。如果alternate
为真,则将数字翻倍,如果翻倍后的数字大于9,则将其替换为两个数字的和加1。最后,函数返回sum
是否能被10整除,以确定数字是否有效。
用个简单的流程图,来描述下处理逻辑:
开始
|
V
获取用户输入的数字
|
V
初始化累加器sum为0,交替标志alternate为false
|
V
从数字的末尾开始,对每个数字执行以下操作:
|
|----> 如果当前数字不是数字,返回false
|
|----> 否则,将当前数字转换为整数n
|
|----> 如果alternate为true,将n乘以2
|
|----> 如果n大于9,将n替换为(n%10)+1
|
|----> 将n加到sum上
|
|----> 将alternate设置为!alternate
|
V
计算sum%10的结果
|
V
如果结果为0,返回true(数字有效)
|
|----> 否则,返回false(数字无效)
|
结束