क्रेडिट कार्ड नंबर के अंकों वाली एक लंबी संख्या को देखते हुए; कार्य यह पता लगाना है कि किसी प्रोग्राम के साथ क्रेडिट कार्ड नंबर मान्य है या नहीं।
क्रेडिट कार्ड की जाँच के लिए वैध है या नहीं, परिणाम घोषित करने के लिए हमें निम्नलिखित सत्यापन सुनिश्चित करने होंगे।
क्रेडिट कार्ड की संख्या में 13 से 16 अंक होने चाहिए, यह निम्नलिखित अंकों से शुरू होना चाहिए।
- सभी वीज़ा कार्ड 4 से शुरू होते हैं
- सभी मास्टर कार्ड 5 से शुरू होते हैं
- 37 अमेरिकन एक्सप्रेस कार्ड की शुरुआत है
- सभी डिस्कवर कार्ड 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 अंक के लिए लुहन चेक या मॉड 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