Open In App

Program for credit card number validation

Write a program that prompts the user to enter a credit card number as a long integer and Display whether that card is valid or invalid.
Credit card numbers follow certain patterns. 
A credit card number must have between 13 and 16 digits. It must start with:

The problem can be solved by using Luhn algorithm



Luhn check or the Mod 10 check, which can be described as follows (for illustration, consider the card number 4388576018402626):

  • Step 1. Double every second digit from right to left. If doubling of a digit results in a 
    two-digit number, add up the two digits to get a single-digit number (like for 12:1+2, 18=1+8).
  • Step 2. Now add all single-digit numbers from Step 1. 
    4 + 4 + 8 + 2 + 3 + 1 + 7 + 8 = 37
  • Step 3. Add all digits in the odd places from right to left in the card number. 
    6 + 6 + 0 + 8 + 0 + 7 + 8 + 3 = 38
  • Step 4. Sum the results from Step 2 and Step 3. 37 + 38 = 75
  • Step 5. If the result from Step 4 is divisible by 10, the card number is valid; otherwise, it is invalid. 

Examples : 



Input : 379354508162306
Output : 379354508162306 is Valid

Input : 4388576018402626
Output : 4388576018402626 is invalid

Implementation:




// C++ program to check if a given credit
// card is valid or not.
#include <iostream>
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 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;
    }
}




class CreditCard:
    # Main Method
    @staticmethod
    def main(args):
        number = 5196081888500645
        print(str(number) + " is " +
              ("valid" if CreditCard.isValid(number) else "invalid"))
         
    # Return true if the card number is valid
    @staticmethod
    def isValid(number):
        return (CreditCard.getSize(number) >= 13 and CreditCard.getSize(number) <= 16) and (CreditCard.prefixMatched(number, 4) or CreditCard.prefixMatched(number, 5) or CreditCard.prefixMatched(number, 37) or CreditCard.prefixMatched(number, 6)) and ((CreditCard.sumOfDoubleEvenPlace(number) + CreditCard.sumOfOddPlace(number)) % 10 == 0)
     
    # Get the result from Step 2
    @staticmethod
    def sumOfDoubleEvenPlace(number):
        sum = 0
        num = str(number) + ""
        i = CreditCard.getSize(number) - 2
        while (i >= 0):
            sum += CreditCard.getDigit(int(str(num[i]) + "") * 2)
            i -= 2
        return sum
       
    # Return this number if it is a single digit, otherwise,
    # return the sum of the two digits
    @staticmethod
    def getDigit(number):
        if (number < 9):
            return number
        return int(number / 10) + number % 10
       
    # Return sum of odd-place digits in number
    @staticmethod
    def sumOfOddPlace(number):
        sum = 0
        num = str(number) + ""
        i = CreditCard.getSize(number) - 1
        while (i >= 0):
            sum += int(str(num[i]) + "")
            i -= 2
        return sum
       
    # Return true if the digit d is a prefix for number
    @staticmethod
    def prefixMatched(number,  d):
        return CreditCard.getPrefix(number, CreditCard.getSize(d)) == d
       
    # Return the number of digits in d
    @staticmethod
    def getSize(d):
        num = str(d) + ""
        return len(num)
       
    # Return the first k number of digits from
    # number. If the number of digits in number
    # is less than k, return number.
    @staticmethod
    def getPrefix(number,  k):
        if (CreditCard.getSize(number) > k):
            num = str(number) + ""
            return int(num[0:k])
        return number
 
if __name__ == "__main__":
    CreditCard.main([])
 
# This code is contributed by Aarti_Rathi




// 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.




<script>
 
// JavaScript program to check if a given credit
// card is valid or not.
 
// Return this number if it is a single digit, otherwise,
// return the sum of the two digits
function getDigit(number)
{
if (number < 9)
    return number;
return Math.floor(number / 10) + number % 10;
}
 
// Return the number of digits in d
function getSize(d)
{
let num = d.toString();
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.
function getPrefix(number,k)
{
if (getSize(number) > k)
{
    let num = number.toString();
    return parseInt(num.substring(0, k));
}
return number;
}
 
// Return true if the digit d is a prefix for number
function prefixMatched(number,d)
{
return getPrefix(number, getSize(d)) == d;
}
 
// Get the result from Step 2
function sumOfDoubleEvenPlace(number)
{
let sum = 0;
let num = number.toString() ;
for (let i = getSize(number) - 2; i >= 0; i -= 2)
    sum += getDigit((num.charCodeAt(i) - '0'.charCodeAt(0)) * 2);
 
return sum;
}
 
// Return sum of odd-place digits in number
function sumOfOddPlace(number)
{
let sum = 0;
let num = number.toString();
for (let i = getSize(number) - 1; i >= 0; i -= 2)
    sum += num.charCodeAt(i) - '0'.charCodeAt(0);
return sum;
}
 
// Return true if the card number is valid
function isValid(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
 
let number = 5196081888500645
document.write(number + " is " + (isValid(number) ? "valid" : "invalid"));
 
 
// This code is contributed by shinjanpatra
 
</script>

Output
5196081888500645 is valid

Time Complexity: O(n), where n represents the size of the given string.
Auxiliary Space: O(1), no extra space is required, so it is a constant.

 


Article Tags :