Computer >> 컴퓨터 >  >> 프로그램 작성 >> C++

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

위 코드 설명

이 접근 방식에서 우리는 현재 모든 분할에서 형성된 숫자의 나머지를 계산했습니다. 첫 번째 숫자는 로 나눌 수 있어야 하므로 순방향 루프를 실행하고 해당 숫자의 모드를 로 저장합니다. b를 사용하여 역방향 루프를 실행하고 mod를 저장합니다. 임의의 위치에서 a의 mod가 0이고 다음 인덱스가 있는 b가 있는 mod가 0이면 그것이 우리의 답이 될 것이며 따라서 인쇄합니다.

결론

이 자습서에서는 파티션 번호를 두 개의 나눌 수 있는 부분으로 찾는 문제를 해결합니다. 우리는 또한 이 문제에 대한 C++ 프로그램과 이 문제를 해결하는 완전한 접근 방식(Normal)을 배웠습니다. C, Java, python 및 기타 언어와 같은 다른 언어로 동일한 프로그램을 작성할 수 있습니다. 이 튜토리얼이 도움이 되기를 바랍니다.