জাভার বিগইন্টিজার(BigInteger)ক্লাস – বেসিক

 

আমরা যারা সাধারণত C/C++ এ কোড করে থাকি, তারা প্রায়শই একটা মধুর (আসলে বেশ প্যারাদায়ক) সমস্যায় পড়ি। প্রোগ্রামিং কনটেস্টে 101000 টাইপ সংখ্যায় ১ এর পাশে ০ এর বহর দেখে আমাদের চোখ যেমন ছানাবড়া, তেমনি কম্পাইলার বাবাজীও এত বড় সংখ্যা দেখে আগেই হার মেনে নেন। কারণ C++ এ সবচেয়ে বড় সংখ্যা যে ডাটাটাইপ ধারণ করতে পারে, সেটাও এই বিশালাকার সংখ্যার কাছে অত্যন্ত মামুলি (unsigned long long এর রেঞ্জঃ 0 to 18,446,744,073,709,551,615 ; মোটামুটি 1018 এর কাছাকাছি) তাই যেকোন ডাটা টাইপের ভ্যারিয়েবল দিয়ে এত্তবড় সংখ্যার যেকোন ক্যালকুলেশন করতে গেলেই ডাটার ওভারফ্লো হয়। সংখ্যাটাকে তখন ICU তে নিয়ে কাঁটাছেড়া করে (আমাদের এই ICU টা হচ্ছে স্ট্রিং অথবা ইন্টিজারের অ্যারে) ব্যবহারের উপযুক্ত করতে হয়। যোগ, বিয়োগ, গুণ, ভাগ আমাদের ছোটবেলার সেই ৯+৭=১৬ এর ৬, হাতে আছে ১ – স্মৃতিগুলো ফিরিয়ে নিয়ে আসে।

 

সমস্যাটা যেমন মধুর, সমস্যার সমাধান তার থেকেও অনেক বেশি মধুর! C++ এ যে কাজ করতে বিশাল বিশাল কোড লিখতে হয়, হালকাপাতলা জাভা এবং জাভার বিগইন্টিজার ক্লাস জানা থাকলে এক লাইনেই তুড়ি মেরে সেই প্রব্লেম সলভ করা যায়। 😎

 

যোগ, বিয়োগ, গুণ, ভাগের মত সহজ ক্যালকুলেশনের জন্য এই ক্লাসে আছে .add( ),  .subtract( ), .multiply( ),  .divide( ) এই মেথডগুলো। এই মেথডগুলো ব্যবহার করে আগে একটা কোড লিখে ফেলা যাক। ও হ্যাঁ, আরেকটা কথা, বিগইন্টিজার ক্লাস ব্যবহারের আগে java.math.BigInteger ক্লাসটা অবশ্যই import করে নিতে হবে।

 


import java.math.BigInteger;
import java.util.Scanner;

public class Main {
    public static void main(String[] args)
    {
        Scanner sc = new Scanner(System.in);
        BigInteger a = new BigInteger("98765432198765432112461212456123123126486423121");
        BigInteger b = new BigInteger("123458656452641567845231234564861253123145");
        BigInteger sum = a.add(b);
        BigInteger sub = a.subtract(b);
        BigInteger multi = a.multiply(b);
        BigInteger div = a.divide(b);
        System.out.println("summation = "+sum);
        System.out.println("subtraction = "+sub);
        System.out.println("multiplication = "+multi);
        System.out.println("division = "+div);
    }
}

 

উপরের কোডে আমরা বিগইন্টিজারের অবজেক্ট a,b ডিক্লেয়ার করেছি এবং কিছু ভ্যালু assign করেছি। আউটপুট হিসেবে আমরা a+b, a-b, a*b, a/b পাচ্ছি।

 

এখানে আরেকটা গুরুত্বপূর্ণ মেথডের কথা উল্লেখ করে রাখা ভাল। ধরা যাক, আমরা কোন বিগইন্টিজার অবজেক্ট এর সাথে int/long value যোগ, বিয়োগ, গুণ, ভাগ ইত্যাদি করতে চাই। সেক্ষেত্রে আমাদের .valueOf() মেথডের প্রয়োজন হবে। এই মেথডের কাজ হল কোন একটি ইন্টিজার অথবা লং ভ্যারিয়েবল বা ভ্যালুকে বিগইন্টিজার অবজেক্টে কনভার্ট করা। double value এক্ষেত্রে প্রযোজ্য নয়, অর্থাৎ .valueOf() এর প্যারামিটার শুধুমাত্র int/long

 


BigInteger a = new BigInteger("98765432198765432112461212456123123126486423121");
BigInteger c = a.multiply(BigInteger.valueOf(100));    //multiplying a by 100


 

এবার একটা সহজ প্রশ্ন। আচ্ছা, 100! এর মান কত?

 

বিশাল বিশাল ক্যালকুলেশন করে অবশেষে পাওয়া গেল এটাঃ

100!=93326215443944152681699238856266700490715968264381621468592963895217599993229915608941463976156518286253697920827223758251185210916864000000000000000000000000

 

কি, চোখমুখ বড় হয়ে গেল?! o_O হওয়ার কথা না, কারণ বোঝাই যাচ্ছে, বিগইন্টিজার খুব সহজেই এই ভ্যালু ধারণ করার ক্ষমতা রাখে, তাই এবার আর কষ্ট করে সংখ্যাটিকে ICU তে নিয়ে যেতে হবে না। শুধু বিগইন্টিজার নামক একটা প্যারাসিটামল খাইয়ে দিলেই সমস্যার সমাধান। কোডটা লিখে ফেলা যাক তাহলেঃ (কোডটা আগে নিজে নিজে ইমপ্লিমেন্ট করার চেষ্টা কর)

 


import java.math.BigInteger;
public class Main {

    public static void main(String[] args) {
        Factorial(100);
    }
    public static void Factorial(int n) {
        
        BigInteger result = new BigInteger("1");
        for (int i=1; i<=n; i++) {
            result = result.multiply(BigInteger.valueOf(i));
        }
        System.out.println(n + "! = " + result);
    }
    
} 

 

সতর্কবাণীঃ বিগইন্টিজার ক্লাসের মেথডগুলো তুলনামূলক স্লো কাজ করে। অতিমাত্রায় ও যত্রতত্র বিগইন্টিজারের ব্যবহার তাই প্রোগ্রামের স্বাস্থ্যের জন্য ক্ষতিকর। যেসব ক্যালকুলেশন ইন্টিজার কিংবা লং ডাটাটাইপের মাধ্যমে করা যাবে, সেগুলোর জন্য তাই বিগইন্টিজার ক্লাস ব্যবহার না করাই উত্তম।

 

প্র্যাকটিস করার জন্য নিচে কয়েকটি প্রবলেম দেওয়া হল! 🙂

 

Krakovia (UVA)

Julka (SPOJ)

Small factorials (SPOJ)

Advertisements

2 thoughts on “জাভার বিগইন্টিজার(BigInteger)ক্লাস – বেসিক

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

w

Connecting to %s