📜  信用卡号码验证程序

📅  最后修改于: 2022-05-13 01:57:07.003000             🧑  作者: Mango

信用卡号码验证程序

编写一个程序,提示用户输入一个长整数的信用卡号,并显示该卡是有效还是无效。
信用卡号码遵循某些模式。
信用卡号必须包含 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