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

제거할 숫자의 위치를 ​​인쇄하여 C++에서 6으로 나눌 수 있는 숫자 만들기

<시간/>

이 문제에서는 숫자가 주어지고 숫자에서 더 많은 숫자를 제거해야 합니다. 제거 후 생성된 새로운 숫자는 6으로 나누어 떨어지도록 합니다.

개념을 더 잘 배우기 위해 예를 들어 보겠습니다 −

Input : 1324
Output : 4

설명 − 4번째 숫자를 제거하면 6으로 나누어지는 132가 됩니다.

여기에 숫자가 주어지고 6으로 나누어 떨어지도록 숫자가 제거된 위치를 반환해야 합니다.

이 문제를 해결하기 위해 문제를 해결하는 논리를 만들려고 합니다. 이를 위해 우리는 숫자가 2와 3으로 나누어 떨어지면 6으로 나눌 수 있다는 지식을 사용할 것입니다.

숫자에서 숫자를 제거한 후 새로 생성된 숫자는 6의 배수, 즉 2와 3의 배수인지 확인합니다.

접근

숫자를 기반으로 숫자를 제거하여 생성된 숫자가 6의 배수인지 아닌지를 알 수 있습니다. 숫자의 마지막 숫자를 보면 두 가지 조건이 발생합니다.

마지막 숫자가 홀수인 경우

마지막 숫자가 홀수인 경우 가능한 유일한 방법은 마지막 숫자를 제거하는 것입니다. 그리고 새 숫자는 마지막 숫자 옆의 숫자가 짝수인 경우에만 6으로 나누어 떨어지지 않습니다. 그렇지 않으면 해결이 불가능합니다.

마지막 숫자가 짝수인 경우

마지막 숫자가 짝수이면 숫자를 3으로 나눈 나머지를 구해야 하며 이 숫자를 기반으로 제거할 수 있는 숫자를 확인할 수 있습니다.

숫자를 3으로 나눌 때 세 가지 경우 -

나머지는 1입니다 - 나눗셈의 나머지가 1이면 배열에서 숫자 1, 4, 7을 제거할 수 있습니다. 제거할 수 있는 숫자가 여러 개인 경우 제거 후 생성된 숫자가 가장 큰 숫자가 되도록 제거합니다.

나머지는 2입니다 - 나눗셈의 나머지가 2이면 배열에서 숫자 2, 5, 8을 제거할 수 있습니다. 제거할 수 있는 숫자가 여러 개인 경우 제거 후 형성된 숫자가 가장 큰 숫자가 되도록 제거합니다.

나머지는 3입니다. - 나눗셈의 나머지가 1이면 숫자 3, 6, 9 중 하나를 배열에서 제거할 수 있습니다. 제거할 수 있는 숫자가 여러 개인 경우 제거 후 형성된 숫자가 가장 큰 숫자가 되도록 제거합니다.

이를 바탕으로 몇 가지 문제를 해결하고 원하는 결과를 찾아봅시다 -

마지막 숫자가 홀수인 경우

1. 34241341

이 경우 제거할 수 있는 유일한 숫자는 마지막 위치에서 1이고 형성된 숫자는 6으로 나누어 떨어지는 3432134입니다. 따라서 제거된 1의 위치, 즉 8

을 반환합니다.

2. 3214241

이 경우 제거할 수 있는 유일한 숫자는 마지막 위치에서 1이고 생성된 숫자는 341224입니다. 이는 6으로 나눌 수 없습니다. 따라서 -1을 반환합니다.

마지막 숫자가 짝수인 경우

1. 8097860

이 경우 숫자를 3으로 나누고 나머지가 2인 나머지를 찾아야 합니다. 따라서 나머지가 2인 경우 숫자에서 2, 5, 8을 제거할 수 있습니다. 따라서 위치 1과 5에서 8을 제거하여 숫자를 2로 나눌 수 있습니다. 첫 번째 위치에서 제거하면 더 작은 숫자가 반환되므로 5번째 위치에서 8을 제거합니다. 새로 형성된 숫자는 809760이며 6으로 나누어 떨어지므로 5를 반환합니다.

예시

이 논리를 기반으로 문제를 해결하는 프로그램을 만들 수 있습니다 -

#include <bits/stdc++.h>
using namespace std;
void isDivisibleBy6(string num){
   int n = num.length();
   int a[n];
   int sum = 0;
   for (int i = 0; i < n; i++) {
      a[i] = num[i] - '0';
      sum += a[i];
   }
   if (a[n - 1] % 2){
      if ( (a[n - 2] % 2 != 0) || (sum - a[n - 1]) % 3 != 0) {
         cout << "-1" << endl;
      }
      else {
         cout << n << endl;
      }
   }
   else {
      int re = sum % 3;
      int del = -1;
      int flag = 0;
      for (int i = 0; i < n - 1; i++) {
         if ((a[i]) % 3 == re) {
            if (a[i + 1] > a[i]) {
               del = i;
               flag = 1;
               break;
            }
            else {
               del = i;
            }
         }
      }
      if (flag == 0) {
         if (a[n - 2] % 2 == 0 and re == a[n - 1] % 3)
            del = n - 1;
      }
      if (del == -1)
         cout << -1 << endl;
      else {
         cout << del + 1 << endl;
      }
   }
}
int main(){
   string number = "343224152";
   isDivisibleBy6(number);
   return 0;
}

출력

5