इस समस्या में, हमें एक स्ट्रिंग दी जाती है जिसे एक संख्या के रूप में व्याख्या किया जा सकता है। अब हमें उस स्ट्रिंग को दो भागों में इस तरह से विभाजित करना है कि पहला भाग 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
अब इस समस्या में, हम कुछ पूर्व-गणना करेंगे जिससे हमारा प्रोग्राम तेज़ हो जाएगा, और फिर यह उच्च बाधाओं पर काम करने में सक्षम होगा।
समाधान खोजने के लिए दृष्टिकोण
इस दृष्टिकोण में, हम स्ट्रिंग के माध्यम से दो लूप चलाएंगे, पहला प्रारंभ से अंत तक और दूसरा अंत से प्रारंभ तक। अब हर बिंदु पर, हम पहले लूप में a और दूसरे लूप में 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
उपरोक्त कोड की व्याख्या
इस दृष्टिकोण में, हमने अब प्रत्येक भाग पर बनने वाली शेष संख्या की गणना की। हमारा पहला नंबर ए से विभाज्य होना चाहिए, इसलिए हम एक फॉरवर्ड लूप चलाते हैं और उस नंबर के मॉड को ए के साथ स्टोर करते हैं। बी के साथ, हम एक बैकवर्ड लूप चलाते हैं और मॉड्स को स्टोर करते हैं क्योंकि हम जानते हैं कि अगर किसी भी स्थिति में हमारा मॉड शून्य है और अगले इंडेक्स के साथ बी के साथ मॉड शून्य है, तो यह हमारा उत्तर होगा, और इसलिए हम इसे प्रिंट करते हैं।
निष्कर्ष
इस ट्यूटोरियल में, हम एक संख्या को दो विभाज्य भागों में विभाजित करने के लिए एक समस्या का समाधान करते हैं। हमने इस समस्या के लिए C++ प्रोग्राम और संपूर्ण दृष्टिकोण (Normal) भी सीखा जिसके द्वारा हमने इस समस्या को हल किया। हम उसी प्रोग्राम को अन्य भाषाओं जैसे सी, जावा, पायथन और अन्य भाषाओं में लिख सकते हैं। हमें उम्मीद है कि आपको यह ट्यूटोरियल मददगार लगा होगा।