신용 카드 번호의 자릿수가 포함된 긴 숫자가 제공됩니다. 작업은 신용 카드 번호가 프로그램으로 유효한지 여부를 찾는 것입니다.
신용카드가 유효한지 아닌지를 확인하기 위해 다음은 결과를 선언할 때 반드시 확인해야 하는 유효성 검사입니다.
신용카드 번호는 13~16자리여야 하며 다음 숫자로 시작해야 합니다.
- 모든 비자 카드는 4부터 시작합니다.
- 모든 마스터 카드는 5부터 시작
- 37은 American Express 카드의 시작입니다.
- 모든 발견 카드는 6부터 시작합니다.
신용카드가 유효한지 확인하는 단계 −
1단계 − 오른쪽에서 왼쪽으로 시작하여 각 숫자를 두 배로 늘려야 합니다. 두 배로 한 결과가 한 자리이면 그대로 두고, 그렇지 않으면 두 자리를 더하여 한 자리 숫자를 얻습니다. (예:22 =2+2=4)
2단계 − 카드 번호의 오른쪽에서 왼쪽으로 시작하여 홀수 자리의 모든 숫자를 더합니다.
3단계 − 1단계에서 얻은 한 자리 숫자를 모두 더합니다.
4단계 − 2단계와 3단계의 결과를 합산합니다.
5단계 − 결과가 10으로 나누어 떨어지면 카드 번호가 유효하고 그렇지 않으면 번호가 유효하지 않습니다.
예시
Input: n = 4440967484181607 Output: 4440967484181607 is valid Input: n = 379354508162306 Output: 379354508162306 is valid
문제를 해결하기 위해 사용하는 접근 방식 -
숫자 4440967484181607에 대해 Luhn 검사 또는 모드 10 검사를 사용할 것입니다.
알고리즘
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
예시
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; } }
출력
4440967484181607 is valid