কম্পিউটার

C++ একটি সংখ্যাকে দুটি বিভাজ্য অংশে ভাগ করুন


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

Input : str = "123", a = 12, b = 3
Output : YES
12 3
"12" is divisible by a and "3" is
divisible by b.

Input : str = "1200", a = 4, b = 3
Output : YES
12 00

Input : str = "125", a = 12, b = 3
Output : NO

এখন এই সমস্যায়, আমরা কিছু পূর্বনির্ধারণ করব যা আমাদের প্রোগ্রামকে দ্রুততর করে তুলবে, এবং তারপর এটি উচ্চতর সীমাবদ্ধতায় কাজ করতে সক্ষম হবে।

সমাধান খোঁজার পদ্ধতি

এই পদ্ধতিতে, আমরা স্ট্রিংয়ের মাধ্যমে দুটি লুপ চালাব, প্রথমটি শুরু থেকে শেষ পর্যন্ত এবং দ্বিতীয়টি শেষ থেকে শুরু পর্যন্ত। এখন প্রতিটি পয়েন্টে, আমরা প্রথম লুপে একটি এবং দ্বিতীয় লুপে b দিয়ে গঠিত পূর্ণসংখ্যার মোড নিই, এবং তারপর আমরা আমাদের উত্তর খুঁজে পেতে পারি।

উদাহরণ

#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++) // front loop for calculating the mod of integer with 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; // as we have assigned answer to last index
    for (int i= n-2; i>=0; i--){ // end loop for calculating the mod of integer with 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++){ // finding the division point
        if (mod_a[i] != 0) // we can skip through all the positions where mod_a is not zero
            continue;
        if (mod_b[i+1] == 0){ // now if the next index of mod_b is also zero so that is our division point
            cout << "YES\n";
            /*******Printing the partitions formed**********/
            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"; // else we print NO
}
// Driver code
int main(){
    string str = "123"; // given string
    int a = 12, b = 3;
    divisionOfString(str, a, b);
    return 0;
}

আউটপুট

YES
12 3

উপরের কোডের ব্যাখ্যা

এই পদ্ধতিতে, আমরা এখন প্রতিটি বিভাগে গঠিত সংখ্যার অবশিষ্টাংশ গণনা করেছি। আমাদের প্রথম সংখ্যাটি a দ্বারা বিভাজ্য হওয়া উচিত, তাই আমরা একটি ফরোয়ার্ড লুপ চালাই এবং সেই সংখ্যাটির মোডটি a দিয়ে সংরক্ষণ করি। b এর সাথে, আমরা একটি ব্যাকওয়ার্ড লুপ চালাই এবং এখন মোডগুলি সংরক্ষণ করি কারণ আমরা জানি যে কোনো অবস্থানে যদি আমাদের একটি মোড শূন্য হয় এবং পরবর্তী সূচকের সাথে b-এর মোড শূন্য হয়, তাহলে এটি হবে আমাদের উত্তর, এবং তাই আমরা এটি প্রিন্ট করি।

উপসংহার

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


  1. একটি সেটকে C++-এ k উপসেটে ভাগ করার উপায় গণনা করুন

  2. একটি বড় সংখ্যা C++ এ 20 দ্বারা বিভাজ্য কিনা তা পরীক্ষা করুন

  3. একটি বড় সংখ্যা 11 দ্বারা বিভাজ্য বা C++ এ নয় তা পরীক্ষা করুন

  4. C++ এ একটি বড় সংখ্যা 15 দ্বারা বিভাজ্য কিনা তা পরীক্ষা করুন