C++ 将一个数分成两个可整除的部分
在这个问题中,我们给出了一个可以解释为数字的字符串。现在我们必须将该字符串分成两部分,这样第一部分可以被A整除,第二部分可以被B整除(给我们两个整数)。例如-
Input : str = "123", a = 12, b = 3 Output : YES 12 3 "12" 可以被一个和整除 "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++) //用于计算整数模的前循环
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) //我们可以跳过所有mod_a不为零的位置
continue;
if (mod_b[i+1] == 0){ //现在如果mod_b的下一个索引也是零,那么这就是我们的分割点
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"; //否则我们打印NO
}
//驱动程序代码
int main(){
string str = "123"; //给定的字符串
int a = 12, b = 3;
divisionOfString(str, a, b);
return 0;
}输出结果YES 12 3
以上代码说明
在这种方法中,我们计算了现在每个分区形成的数字的余数。我们的第一个数字应该可以被a整除,所以我们运行一个前向循环并用a存储该数字的mod。对于b,我们现在运行一个反向循环并存储mods,因为我们知道如果我们在任何位置的a的mod为零,并且具有下一个索引的b的mod为零,这将是我们的答案,因此我们将其打印出来。
结论
在本教程中,我们解决了一个问题,将一个数字分成两个可整除的部分。我们还学习了针对此问题的C++程序以及解决此问题的完整方法(Normal)。我们可以用其他语言编写相同的程序,例如C、java、python和其他语言。我们希望本教程对您有所帮助。