ให้ตัวเลขยาวที่มีตัวเลขของหมายเลขบัตรเครดิต งานคือการค้นหาว่าหมายเลขบัตรเครดิตถูกต้องหรือไม่กับโปรแกรม
สำหรับการตรวจสอบบัตรเครดิตว่าถูกต้องหรือไม่ ต่อไปนี้คือการตรวจสอบความถูกต้องที่เราต้องแน่ใจว่าได้ประกาศผล
หมายเลขบัตรเครดิตต้องมี 13 ถึง 16 หลัก โดยต้องขึ้นต้นด้วยตัวเลขต่อไปนี้
- บัตรวีซ่าทั้งหมดเริ่มต้นที่ 4
- มาสเตอร์การ์ดทั้งหมดเริ่มต้นที่ 5
- 37 เป็นจุดเริ่มต้นสำหรับบัตรอเมริกัน เอ็กซ์เพรส
- การ์ด Discover ทั้งหมดเริ่มต้นที่ 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
แนวทางที่เราใช้ในการแก้ปัญหา −
เราจะใช้เช็ค Luhn หรือเช็ค mod 10 สำหรับหลัก 4440967484181607
อัลกอริทึม
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