এই প্রব্লেমে ভাজ্য(Dividend) এবং ভাজক(Divisor) দেয়া থাকবে, ভাগফল(Quotient) বের করতে হবে। খুবই সহজ, রাইট ?
কিন্তু কোনো প্রকার গুন,ভাগ অথবা মোড করে বের করা যাবেনা ।
প্রথম কিছু ব্যাসিক জিনিস নিয়ে আলাপ করি।
দুইটা সংখ্যার ভাগফল কি ? এটা হইতেছে ভাজ্য থেকে "কতবার" ভাজক বিয়োগ করি সেটাই । আরো ক্লিয়ারলি বলি, ধরলাম ভাজ্য ১০ এবং ভাজক ২, তাহলে ভাজ্য থেকে যদি ভাজক কে ৫ বার বিয়োগ করলেই হইতেছে ।
অর্থ্যাত "নাম্বার অফ টাইমস" ভাজক'কে ভাজ্য থেকে বিয়োগ করলেই আমরা ভাগফল পাবো। এই এক লাইন ই যথেষ্ট এই প্রবলেম টা সলভ করার জন্য।
এই বিয়োগের ব্যাপারটা আমরা বিট ম্যানিপুলেশনের লেফট শিফট ব্যবহার করে করতে পারি ।
একটা উদাহরন নিই, ভাজ্য ১৬, ভাজক ৪ । যতক্ষন ভাজ্য জিরো(০) সমান অথবা বড় থাকবে ততক্ষন আমরা ভাজককে বিয়োগ করবো তাইতো ?
১৬ - ৪>=০
১২ - ৪>=০
৮ - ৪>=০
৪ - ৪ >=০
০
অর্থ্যাত ৫ ধাপে আমরা শুন্যতে চলে গেছি, আরো একটু ভালো করে বললে ভাজক, ভাজ্যের থেকে বড় হয়ে গেছে ।
আসলে আমরা ভাজক কে বিয়োগ করতেছি একসাথে তার ভ্যালু কিন্তু বাড়তেছে ।
আমরা এটা ইকুয়েশন দিয়েও লিখতে পারি ।
Dividend = NumberofTimes * Divisor + extra
16 = 4*4 + 0 ( 16 = Dividend, 4 = Divisor, 4 = Quotient)
13 = 3*4 + 1 ( 13 = Dividend, 4 = Divisor, 3 = Quotient)
তাহলে এখানে হইতছে একচুয়ালি এটা,
১৬ - ৪ = ১৬ - ৪*২ = ১৬ - ৪*৩ = ১৬ - ৪*৪ = ০
অর্থাৎ "Left shifting", 4<<=1
এটার জন্য আমাদেরকে পুরো অপারেশন টা নন নেগেটিভ নাম্বারের জন্য করতে হবে । সুতরাং ফলাফল শেষে চিহ্ন(-/+) হবে সেটা মেইনটেইন করতে হবে।
For better understanding see the code
No comments:
Post a Comment