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

C++ 프로그램에서 숫자의 거듭제곱인 주어진 가중치를 사용하여 균형 팬

<시간/>

STATEMENT - 숫자의 거듭제곱인 주어진 가중치를 사용하여 균형을 조정합니다.

설명 - 이 문제에서는 팬 기반의 계량기가 제공됩니다. 가중치 T와 그 값이 숫자 의 거듭제곱인 다른 가중치가 주어집니다. 주어진 무게를 사용하여 팬의 균형을 맞춰야 합니다.

이제 이를 기반으로 다음 방정식이 있습니다.

T + (일부 거듭제곱) =(일부 다른 거듭제곱)

이제 우리는 거듭제곱 값에 해당하는 정확히 하나의 가중치가 있음을 기억해야 합니다.

T = 12 : a = 4

아래 값을 사용하여 다음과 같이 가중치의 균형을 맞출 수 있습니다.

12 + 4 = 16

이제 이 문제를 해결하려면 T를 거듭제곱으로 나타내야 합니다. 이를 위해 T의 기수를 10진법에서 10진법으로 변경합니다.

사례 1 − 기준을 변경할 때 표현의 값에 1과 0만 있는 경우. 그런 다음 1의 가중치를 사용하여 T의 값을 가산적으로 생성할 수 있습니다.

예를 들어 보겠습니다.

T = 10 : a = 3,

10의 밑수를 3으로 변경하면 값은 101이 됩니다.

따라서 3 0 을 사용하여 만들어집니다. 및 3 2 (1 + 9) =10.

사례 2 − base를 변경할 때 표현에 1과 0이 아닌 값만 있을 경우 밸런싱을 하려면 좀 더 많은 작업이 필요합니다. 여기서 솔루션의 필수 조건은 기본 변환이 (a - 1)의 자릿수 값을 가져야 한다는 것입니다. 이 경우 값의 거듭제곱을 T's did에 옮깁니다. 그리고 기본 표현의 수를 1만큼 늘립니다.

예를 들어 보겠습니다.

T = 7 : a = 3

7의 밑수를 3으로 변경하면 021이 됩니다.

전송 3 1 T의 측면으로 이동하고 다른 측면을 1만큼 증가시킵니다. 우리는 숫자 =10을 얻습니다. 이는 101 즉 (9 + 1)로 표시됩니다. 균형을 잡을 수 있습니다.

위의 사례를 바탕으로 이 문제를 해결하기 위한 프로그램을 만들 것입니다.

예시

#include <bits/stdc++.h>
using namespace std;
bool isBalancePossible(int T, int a){
   vector<int> baseForm;
   while (T) {
      baseForm.push_back(T % a);
      T /= a;
   }
   baseForm.push_back(0);
   for (int i = 0; i < baseForm.size(); i++) {
      if (baseForm[i] != 0 && baseForm[i] != 1 &&
      baseForm[i] != (a - 1) && baseForm[i] != a)
      return false;
   if (baseForm[i] == a || baseForm[i] == (a - 1))
      baseForm[i + 1] += 1;
   }
   return true;
}
int main(){
   int T = 21;
   int a = 4;
   if (isBalancePossible(T, a))
      cout << "Balance is possible" << endl;
   else
      cout << "Balance is not possible" << endl;
   return 0;
}

출력

Balance is possible