কম্পিউটার টিউটোরিয়াল

C++ দিয়ে একটি সংখ্যাকে দুই ভাগে ভাগ করা যাতে উভয় ভাগ বিভাজ্য হয়

এই সমস্যায়, আমাদের একটি স্ট্রিং দেওয়া আছে যা একটি সংখ্যা রিপ্রেজেন্ট করে। এখন আমাদের স্ট্রিংটিকে দুটি অংশে ভাগ করতে হবে যাতে প্রথম অংশ A দিয়ে বিভাজ্য হয় এবং দ্বিতীয় অংশ B দিয়ে বিভাজ্য হয় (A এবং B দুটি পূর্ণসংখ্যা দেওয়া আছে)। উদাহরণ −

ইনপুট: str = "123", a = 12, b = 3 আউটপুট: YES 12 3 "12" হলো a দিয়ে বিভাজ্য এবং "3" হলো b দিয়ে বিভাজ্য।
ইনপুট: str = "1200", a = 4, b = 3 আউটপুট: YES 12 00
ইনপুট: str = "125", a = 12, b = 3 আউটপুট: NO

এই সমস্যাতেই, আমরা কিছু প্রিক্যালকুলেশন (precalculation) করব যা প্রোগ্রামটিকে দ্রুত করবে এবং উচ্চ কনস্ট্রেইন্টের জন্যও কাজ করবে।

সমাধানের পদ্ধতি

এই পদ্ধতিতে, আমরা স্ট্রিংয়ের মধ্য দিয়ে দুটি লুপ চালাব: প্রথমটি শুরু থেকে শেষ পর্যন্ত (forward) এবং দ্বিতীয়টি শেষ থেকে শুরু পর্যন্ত (backward)। প্রতিটি পয়েন্টে, প্রথম লুপে গঠিত সংখ্যার A দিয়ে মডুলো (mod) এবং দ্বিতীয় লুপে B দিয়ে মডুলো নিয়ে রাখব। এরপর আমরা বিভাজন পয়েন্ট (division point) খুঁজে বের করব।

উদাহরণ
 #include <bits/stdc++.h> using namespace std; void divisionOfString(string &str, int a, int b){     int n = str.length();     vector<int> mod_a(n+1, 0);     mod_a[0] = (str[0] - '0') % a;     for (int i = 1; i < n; i++) // ফরওয়ার্ড লুপ: A দিয়ে মডুলো         mod_a[i] = ((mod_a[i-1] * 10) % a + (str[i] - '0')) % a;     vector<int> mod_b(n+1, 0);     mod_b[n-1] = (str[n-1] - '0') % b;     int power10 = 10; // লাস্ট ইনডেক্সে মান দেওয়া হয়েছে     for (int i = n-2; i >= 0; i--) { // ব্যাকওয়ার্ড লুপ: B দিয়ে মডুলো         mod_b[i] = (mod_b[i+1] + (str[i] - '0') * power10) % b;         power10 = (power10 * 10) % b;     }     for (int i = 0; i < n-1; i++) { // বিভাজন পয়েন্ট খোঁজা         if (mod_a[i] != 0) continue; // mod_a শূন্য নাও হলে স্কিপ         if (mod_b[i+1] == 0) { // পরের ইনডেক্সে mod_b শূন্য হলে সেটিই উত্তর             cout << "YES\n";             /*******বিভাজন প্রিন্ট**********/             for (int k = 0; k <= i; k++) cout << str[k];             cout << " ";             for (int k = i+1; k < n; k++) cout << str[k];             return;         }     }     cout << "NO\n"; // অন্যথায় NO } int main(){     string str = "123";     int a = 12, b = 3;     divisionOfString(str, a, b);     return 0; }
আউটপুট
YES 12 3
কোডের ব্যাখ্যা

এই পদ্ধতিতে, আমরা প্রতিটি বিভাজন পয়েন্টে গঠিত সংখ্যার রিমেইন্ডার (remainder) বের করেছি। প্রথম সংখ্যাটি A দিয়ে বিভাজ্য হতে হবে, তাই ফরওয়ার্ড লুপ চালিয়ে A দিয়ে মডুলো সংরক্ষণ করেছি। B-এর জন্য ব্যাকওয়ার্ড লুপ চালিয়ে মডুলো সংরক্ষণ করেছি। যেহেতু যেকোনো পজিশনে mod_a শূন্য এবং পরের ইনডেক্সে mod_b শূন্য হলে সেটিই আমাদের विभাজন পয়েন্ট, তাই সেটি প্রিন্ট করেছি।

উপসংহার

এই টিউটোরিয়ালে আমরা একটি সংখ্যাকে দুটি বিভাজ্য অংশে ভাগ করার সমস্যা সমাধান করেছি। আমরা এই সমস্যার C++ প্রোগ্রাম ও সম্পূর্ণ পদ্ধতি দেখেছি। একই প্রোগ্রাম C, Java, Python ইত্যাদি ভাষায়ও লিখা যায়। আশা করি আপনি এই টিউটোরিয়ালটি সহায়ক পাবেন।

  1. C++-এ একটি সেটকে k সাবসেটে ভাগ করার পদ্ধতির সংখ্যা গণনা

  2. C++ প্রোগ্রাম: বড় সংখ্যা ২০ দিয়ে বিভাজ্য কিনা চেক (স্ট্রিং ইনপুট)

  3. C++ প্রোগ্রাম: বড় সংখ্যা ১১ দিয়ে বিভাজ্য কিনা চেক (স্ট্রিং ইনপুট)

  4. C++ প্রোগ্রাম: বড় সংখ্যা ১৫ দিয়ে বিভাজ্য কিনা চেক (স্ট্রিং ইনপুট)