একটি লম্বা নম্বর দেওয়া আছে যেটি ক্রেডিট কার্ডের ডিজিটগুলো ধারণ করে; কাজটি হলো একটি প্রোগ্রাম দিয়ে জানতে যে ক্রেডিট কার্ড নম্বরটি বৈধ (valid) কিনা।
একটি ক্রেডিট কার্ড নম্বরের বৈধতার শর্তগুলো:
- নম্বরটির ডিজিট সংখ্যা ১৩ থেকে ১৬ এর মধ্যে হতে হবে।
- শুরুর ডিজিট নির্দিষ্ট: ভিসা কার্ড ৪ দিয়ে শুরু হয়, মাস্টার কার্ড ৫ দিয়ে, আমেরিকান এক্সপ্রেস ৩৭ দিয়ে, ডিসকভার কার্ড ৬ দিয়ে।
যাচাই করার ধাপসমূহ (Luhn Algorithm / Mod 10 Check):
- স্টেপ ১: ডান থেকে বামে প্রতিটি ডিজিট ডাবল করুন। ডাবল করার ফলাফল যদি এক ডিজিট হয়, তবে সেটি থাকতে দিন; যদি দুই ডিজিট হয়, তবে দুটি ডিজিট যোগ করে এক ডিজিট বানান (যেমন ২২ = ২+২ = ৪)।
- স্টেপ ২: ডান থেকে বামে যেসব ডিজিট অড্ড পজিশনে আছে, সেগুলো যোগ করুন।
- স্টেপ ৩: স্টেপ ১-এ প্রাপ্ত এক-ডিজিটের সংখ্যাগুলো যোগ করুন।
- স্টেপ ৪: স্টেপ ২ এবং স্টেপ ৩-এর ফলাফল যোগ করুন।
- স্টেপ ৫: যদি মোট যোগফল ১০ দিয়ে বিভাজ্য হয়, তবে কার্ড নম্বরটি বৈধ, অন্যথায় অবৈধ।
উদাহরণ ইনপুট/আউটপুট
Input: n = 4440967484181607 Output: 4440967484181607 is valid Input: n = 379354508162306 Output: 379354508162306 is valid
অ্যালগরিদম ও সম্পূর্ণ কোড
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
long cnumber = 4440967484181607L;
System.out.println(cnumber + " is " + (validitychk(cnumber) ? "valid" : "invalid"));
}
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);
}
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;
}
public static int getDigit(int cnumber) {
if (cnumber < 9) return cnumber;
return cnumber / 10 + cnumber % 10;
}
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;
}
public static boolean prefixmatch(long cnumber, int d) {
return getprefx(cnumber, thesize(d)) == d;
}
public static int thesize(long d) {
String num = d + "";
return num.length();
}
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