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