この質問では、数値として解釈できる文字列が与えられています。次に、この文字列を 2 つの部分に分割し、最初の部分が A で割り切れ、2 番目の部分が B (2 つの整数が与えられた場合) で割り切れるようにする必要があります。例: -
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
さて、この問題では、プログラムを高速化するために事前計算を行い、より高い制約の下でも動作できるようにします。
この方法では、文字列内で 2 つのループを実行します。最初のループは先頭から末尾まで、2 番目のループは末尾から先頭までです。ここで、各ポイントで、最初のループの an と 2 番目のループの 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 で割り切れる必要があるため、順方向ループを実行し、その数値の mod を a に格納します。 b については、逆方向ループを実行し、mod を保存します。任意の位置の an の mod が 0 で、次のインデックスでの b の mod が 0 であれば、これが答えになることがわかっているため、それを出力します。 。
このチュートリアルでは、数値を 2 つの割り切れる部分に分割する問題を解決しました。また、この問題に対する C プログラムと、それを解決するための完全な方法 (一般的) も学びました。同じプログラムを C、Java、Python などの他の言語で書くことができます。このチュートリアルがお役に立てば幸いです。
以上が以下を中国語に翻訳します。 C++ 数値を 2 つの割り切れる部分に分割します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。