在這個問題中,我們得到了一個可以解釋為數字的字串。現在我們必須將字串分割為兩個部分,使得第一部分可被 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
現在,在這個問題中,我們將進行一些預先計算,以使我們的程式更快,然後它將能夠在更高的約束條件下工作。
在這種方法中,我們將在字串中運行兩個循環,第一個循環從開始到結束,第二個循環從結束到開始。現在,在每個點,我們對第一個循環中的 an 和第二個循環中的 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 儲存該數字的 mod。對於b,我們運行一個向後循環並現在存儲mod,因為我們知道,如果任何位置的an 的mod 為零,並且下一個索引的b 的mod 為零,這將是我們的答案,因此我們打印它。
在本教程中,我們解決了一個問題,將一個數字分成兩個可整除的部分。我們也學習了該問題的 C 程序以及解決該問題的完整方法(普通)。我們可以用其他語言像是C、java、python等語言來寫同樣的程式。我們希望本教學對您有所幫助。
以上是將以下內容翻譯為中文:C++ 將一個數分成兩個可被整除的部分的詳細內容。更多資訊請關注PHP中文網其他相關文章!