C++ 信用卡验证器
使用C++编写了信用卡验证器应用程序。它使用Luhn算法验证信用卡号并确定信用卡类型。使用C++编程语言创建了一个信用卡验证器应用程序,用于验证用户的信用卡号的有效性。
它使用Luhn算法确定信用卡号是否有效。Luhn方法是一种简单的检验和公式,可用于验证各种身份信息,包括信用卡号、IMEI号等,尽管它最常用于验证信用卡号。
概述
在输入信用卡号后,系统将验证其有效性并确定它是Visa、MasterCard、美国运通还是其他类型的卡。通过执行一些基本操作和验证,验证卡片的真实性和信用卡类型。用户输入的信用卡号将生成,并附带指示卡片是否有效的消息。如果输入的信用卡号有效,还将打印出信用卡类型。
信用卡号有一定的模式。
信用卡号必须包含13到16位数字。它必须以以下内容开头:
- Visa卡片为4
- Master卡片为5
- 美国运通卡为37
- Discover卡为6
Luhn算法可用于解决此问题。
Luhn算法
Luhn方法,通常称为模10或模10算法,是一种简单的检验和技术,用于验证许多身份证号码,包括加拿大社保号码、IMEI号码和信用卡号码等。一组数学家在20世纪60年代末发明了LUHN公式。然后,信用卡公司很快采用了它。任何人都可以使用该算法,因为它在公共领域中是免费提供的。这种技术是区分合法号码和错误输入或其他情况下的号码的常用方式,适用于大多数信用卡和许多政府身份证件号码。它是为了防止无意错误而不是恶意攻击而创建的。
Luhn检查,通常称为Mod 10检查,可以如下解释(示例,使用卡号4388576018402626):
第1步: 从右到左,将每个偶数位的数字翻倍。在翻倍数字的同时产生一个个位数的数字,将两个数字放在一起(示例,12:1+2,18:1+8)。
第2步: 将第1步中的所有个位数相加。
4 + 4 + 8 + 2 + 3 + 1 + 7 + 8 = 37
第3步: 将卡号的所有奇数位数字从右到左加起来。
6 + 6 + 0 + 8 + 0 + 7 + 8 + 3 = 38
第4步: 将第2步和第3步的结果相加。37 + 38 = 75
第5步: 如果第4步的答案可以被10整除,则卡号有效;否则,卡号无效。
程序分解
#include < iostream >
#include < bits/stdc++.h >
#include < math >
我们在C++中包含了所有信用卡验证器所需的文件。
int getDigit( int number )
{
if ( number < 9 )
return number;
return number / 10 + number % 10;
}
以上的函数 getDigit 将返回两个数字的和,否则返回这个数字本身,如果它是一个个位数。
int getSize( long d )
{
string num = to_string( d );
return num.length( );
}
上面提到的函数将返回d中数字的位数
long getPrefix( long number , int k )
{
if (getSize( number ) > k)
{
string num = to_string( number );
return stol( num.substr( 0 , k ));
}
return number;
}
上述所提到的函数即getPrefix将从number中返回前k个数字。如果number中的数字个数少于k,则返回该数字。
bool prefixMatched( long number , int d )
{
return getPrefix( number , getSize ( d )) == d;
}
如果数字d是数字number的前缀,函数prefixMatched将返回true。//从第2步获取结果
int sumOfDoubleEvenPlace( long int number )
{
int sum = 0;
string num = to_string( number );
for (int i = getSize( number ) - 2; i > = 0; i - = 2)
sum + = getDigit( int( num [ i ] - ' 0 ' ) * 2);
return sum;
}
上述提到的函数将返回从第2步得到的结果
int sumOfOddPlace( long number )
{
int sum = 0;
string num = to_string( number );
for (int i = getSize( number ) - 1; i > = 0; i - = 2)
sum + = num[ i ] - ' 0 ';
return sum;
}
上述函数即sumOfOddPlace将返回数字中奇数位置的数字的总和。
bool isValid( long int number )
{
return (getSize( number ) >= 13 & &getSize( number ) <= 16) && ( prefixMatched( number , 4) || prefixMatched(number , 5) || prefixMatched( number , 37) || prefixMatched( number, 6)) && ((sumOfDoubleEvenPlace ( number ) + sumOfOddPlace( number )) % 10 = = 0);
}
上述的函数即isValid是布尔类型的,如果用户输入的卡号有效,将返回true。
int main( )
{
long int number = 5196081888500645L;
cout << number << " is " << (isValid( number ) ? " valid " : " invalid ");
return 0;
}
驱动程序代码将类似于这样,包含一个长整数数值作为信用卡号。然后使用三元运算符,我们检查isValid函数是否返回true,如果是,则打印“有效”,否则打印“无效”。
C++信用卡验证器程序
// C++ program to check if a given credit
// card is valid or not.
#include
using namespace std;
// Return this number if it is a single digit, otherwise,
// return the sum of the two digits
int getDigit(int number)
{
if (number < 9)
return number;
return number / 10 + number % 10;
}
// Return the number of digits in d
int getSize(long d)
{
string num = to_string(d);
return num.length();
}
// Return the first k number of digits from
// number. If the number of digits in number
// is less than k, return number.
long getPrefix(long number, int k)
{
if (getSize(number) > k)
{
string num = to_string(number);
return stol(num.substr(0, k));
}
return number;
}
// Return true if the digit d is a prefix for number
bool prefixMatched(long number, int d)
{
return getPrefix(number, getSize(d)) == d;
}
// Get the result from Step 2
int sumOfDoubleEvenPlace(long int number)
{
int sum = 0;
string num = to_string(number);
for (int i = getSize(number) - 2; i >= 0; i -= 2)
sum += getDigit(int(num[i] - '0') * 2);
return sum;
}
// Return sum of odd-place digits in number
int sumOfOddPlace(long number)
{
int sum = 0;
string num = to_string(number);
for (int i = getSize(number) - 1; i >= 0; i -= 2)
sum += num[i] - '0';
return sum;
}
// Return true if the card number is valid
bool isValid(long int number)
{
return (getSize(number) >= 13 &&
getSize(number) <= 16) &&
(prefixMatched(number, 4) ||
prefixMatched(number, 5) ||
prefixMatched(number, 37) ||
prefixMatched(number, 6)) &&
((sumOfDoubleEvenPlace(number) +
sumOfOddPlace(number)) %
10 ==
0);
}
// Driver Code
int main()
{
long int number = 51960818885000645L;
cout << number << " is " << (isValid(number) ? "valid" : "invalid");
return 0;
}
输出:
5116021318510645L is valid.
............................
Process executed in 1.22 seconds
Press any key to continue.
时间复杂度为O(n),其中n是所提供字符串的长度。
辅助空间:O(1);这是一个常数,因为不需要额外的空间。