Computer >> Máy Tính >  >> Lập trình >> Java

Chương trình Java để xác thực số thẻ tín dụng

Cho một số dài chứa các chữ số của số thẻ tín dụng; nhiệm vụ là tìm xem số thẻ tín dụng có hợp lệ hay không với một chương trình.

Để kiểm tra thẻ tín dụng có hợp lệ hay không, sau đây là những xác nhận mà chúng tôi phải chắc chắn để khai báo kết quả.

Số thẻ tín dụng phải có từ 13 đến 16 chữ số, phải bắt đầu bằng các chữ số sau.

  • Tất cả các thẻ visa đều bắt đầu từ 4
  • Tất cả các thẻ chính bắt đầu từ 5
  • 37 là điểm bắt đầu cho thẻ American express Card
  • Tất cả các thẻ khám phá bắt đầu từ 6

Các bước để kiểm tra xem thẻ tín dụng có hợp lệ hay không -

Bước 1 - Bắt đầu từ phải sang trái ta phải nhân đôi từng chữ số, nếu kết quả của nhân đôi là một chữ số thì giữ nguyên, còn lại cộng hai chữ số để được số có một chữ số. (như 22 =2 + 2 =4)

Bước 2 - Bắt đầu từ phải sang trái của số thẻ, thêm tất cả các chữ số ở các vị trí lẻ.

Bước 3 - Cộng tất cả số có một chữ số thu được từ Bước 1.

Bước 4 - Cộng các kết quả từ Bước 2 và Bước 3.

Bước 5 - Nếu kết quả chia hết cho 10 thì số thẻ hợp lệ, số không hợp lệ.

Ví dụ

Input: n = 4440967484181607
Output: 4440967484181607 is valid

Input: n = 379354508162306
Output: 379354508162306 is valid

Phương pháp tiếp cận chúng tôi đang sử dụng để giải quyết vấn đề -

Chúng tôi sẽ sử dụng kiểm tra Luhn hoặc kiểm tra mod 10, cho chữ số 4440967484181607.

Thuật toán

Start
   Step1-> In function void main(String[] args)
      Declare and initialize cnumber = 4440967484181607L
      Call function validitychk
      Print the result
   Step 2-> In function boolean validitychk(long cnumber)
      Return thesize(cnumber) >= 13 && thesize(cnumber) <= 16) && (prefixmatch(cnumber, 4) ||
        prefixmatch(cnumber, 5) || prefixmatch(cnumber, 37) || prefixmatch(cnumber, 6)) && ((sumdoubleeven(cnumber) +
      sumodd(cnumber)) % 10 == 0
   Step 3-> In function int sumdoubleeven(long cnumber)
      Declare and set sum = 0
      Declare and set num = cnumber + ""
      Loop For i = thesize(cnumber) – 2 and i >= 0 and i -= 2
         Set sum = sum + getDigit(Integer.parseInt(num.charAt(i) + "") * 2)
      Return sum
   Step 4-> In function int getDigit(int cnumber)
      if cnumber < 9 then,
         Return cnumber
      Return cnumber / 10 + cnumber % 10
   Step 5-> In function int sumodd(long cnumber)
      Set sum = 0
      Set num = cnumber + ""
      Loop For i = thesize(cnumber) – 1 and i >= 0 and i -= 2
         Set sum = sum + Integer.parseInt(num.charAt(i) + "")
      Return sum
   Step 6-> In function boolean prefixmatch(long cnumber, int d)
      Return getprefx(cnumber, thesize(d)) == d
   Step 7-> In function int thesize(long d)
      Set num = d + ""
      Return num.length()
   Step8-> In function long getprefx(long cnumber, int k)
      If thesize(cnumber) > k then,
      Set num = cnumber + ""
      Return Long.parseLong(num.substring(0, k))
      Return cnumber
Stop

Ví dụ

import java.util.Scanner;
public class Main {
   // Main Method
   public static void main(String[] args) {
      long cnumber = 4440967484181607L;
      System.out.println(cnumber + " is " + (validitychk(cnumber) ? "valid" : "invalid"));
   }
   // Return true if the card number is valid
   public static boolean validitychk(long cnumber) {
      return (thesize(cnumber) >= 13 && thesize(cnumber) <= 16) && (prefixmatch(cnumber, 4)
         || prefixmatch(cnumber, 5) || prefixmatch(cnumber, 37) || prefixmatch(cnumber, 6))
         && ((sumdoubleeven(cnumber) + sumodd(cnumber)) % 10 == 0);
   }
   // Get the result from Step 2
   public static int sumdoubleeven(long cnumber) {
      int sum = 0;
      String num = cnumber + "";
      for (int i = thesize(cnumber) - 2; i >= 0; i -= 2)
         sum += getDigit(Integer.parseInt(num.charAt(i) + "") * 2);
      return sum;
   }
   // Return this cnumber if it is a single digit, otherwise,
   // return the sum of the two digits
   public static int getDigit(int cnumber) {
      if (cnumber < 9)
         return cnumber;
      return cnumber / 10 + cnumber % 10;
   }
   // Return sum of odd-place digits in cnumber
   public static int sumodd(long cnumber) {
      int sum = 0;
      String num = cnumber + "";
      for (int i = thesize(cnumber) - 1; i >= 0; i -= 2)
         sum += Integer.parseInt(num.charAt(i) + "");
      return sum;
   }
   // Return true if the digit d is a prefix for cnumber
   public static boolean prefixmatch(long cnumber, int d) {
      return getprefx(cnumber, thesize(d)) == d;
   }
   // Return the number of digits in d
   public static int thesize(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 getprefx(long cnumber, int k) {
      if (thesize(cnumber) > k) {
         String num = cnumber + "";
         return Long.parseLong(num.substring(0, k));
      }
      return cnumber;
   }
}

Đầu ra

4440967484181607 is valid