信用卡号码验证程序
编写一个程序,提示用户输入一个长整数的信用卡号,并显示该卡是有效还是无效。
信用卡号码遵循某些模式。
信用卡号必须包含 13 到 16 位数字。它必须以:
- 4 Visa卡
- 5 为万事达卡
- 美国运通卡 37
- 6 用于发现卡
这个问题可以通过 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 整除,则卡号有效;否则无效。
例子 :
Input : 379354508162306
Output : 379354508162306 is Valid
Input : 4388576018402626
Output : 4388576018402626 is invalid
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 = 5196081888500645L;
cout << number << " is " << (isValid(number) ? "valid" : "invalid");
return 0;
}
// This code is contributed by yuvraj_chandra
Java
// Java program to check if a given credit
// card is valid or not.
import java.util.Scanner;
public class CreditCard {
// Main Method
public static void main(String[] args)
{
long number = 5196081888500645L;
System.out.println(number + " is " +
(isValid(number) ? "valid" : "invalid"));
}
// Return true if the card number is valid
public static boolean isValid(long 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);
}
// Get the result from Step 2
public static int sumOfDoubleEvenPlace(long number)
{
int sum = 0;
String num = number + "";
for (int i = getSize(number) - 2; i >= 0; i -= 2)
sum += getDigit(Integer.parseInt(num.charAt(i) + "") * 2);
return sum;
}
// Return this number if it is a single digit, otherwise,
// return the sum of the two digits
public static int getDigit(int number)
{
if (number < 9)
return number;
return number / 10 + number % 10;
}
// Return sum of odd-place digits in number
public static int sumOfOddPlace(long number)
{
int sum = 0;
String num = number + "";
for (int i = getSize(number) - 1; i >= 0; i -= 2)
sum += Integer.parseInt(num.charAt(i) + "");
return sum;
}
// Return true if the digit d is a prefix for number
public static boolean prefixMatched(long number, int d)
{
return getPrefix(number, getSize(d)) == d;
}
// Return the number of digits in d
public static int getSize(long d)
{
String num = 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.
public static long getPrefix(long number, int k)
{
if (getSize(number) > k) {
String num = number + "";
return Long.parseLong(num.substring(0, k));
}
return number;
}
}
C#
// C# program to check if a given
// credit card is valid or not.
using System;
class CreditCard {
// Main Method
public static void Main()
{
long number = 5196081888500645L;
Console.Write(number + " is " +
(isValid(number) ?
"valid" : "invalid"));
}
// Return true if the card number is valid
public static bool isValid(long 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);
}
// Get the result from Step 2
public static int sumOfDoubleEvenPlace(long number)
{
int sum = 0;
String num = number + "";
for (int i = getSize(number) - 2; i >= 0; i -= 2)
sum += getDigit(int.Parse(num[i] + "") * 2);
return sum;
}
// Return this number if it is a
// single digit, otherwise, return
// the sum of the two digits
public static int getDigit(int number)
{
if (number < 9)
return number;
return number / 10 + number % 10;
}
// Return sum of odd-place digits in number
public static int sumOfOddPlace(long number)
{
int sum = 0;
String num = number + "";
for (int i = getSize(number) - 1; i >= 0; i -= 2)
sum += int.Parse(num[i] + "");
return sum;
}
// Return true if the digit d
// is a prefix for number
public static bool prefixMatched(long number, int d)
{
return getPrefix(number, getSize(d)) == d;
}
// Return the number of digits in d
public static int getSize(long d)
{
String num = 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.
public static long getPrefix(long number, int k)
{
if (getSize(number) > k)
{
String num = number + "";
return long.Parse(num.Substring(0, k));
}
return number;
}
}
// This code is contributed by nitin mittal.
输出:
5196081888500645 is valid