//384K 79MS G++
#include <cstdio>
#include <cstring>
using namespace std;
const int MAX = 22;
long long weights[MAX];
void init() {
int res = 1;
for (int i = 0; i < MAX; i++) {
weights[i] = res;
res *= 3;
}
}
int leftPart[21];
int rightPart[21];
int leftPos;
int rightPos;
void solve(int val) {
int carry = 0;
// printf("r %d\n", 20%3);
for (int i = 0; i < MAX - 1; i++) {
// if (val > 0) {
int curWeightDigit = val%3;
curWeightDigit += carry;
if (curWeightDigit == 1) { // right need a poise
// printf("A %d %lld %d\n", i, weights[i+1], carry);
rightPart[rightPos++] = weights[i];
carry = 0;
} else if (curWeightDigit == 2) {
leftPart[leftPos++] = weights[i];
// printf("B %d %lld %d\n", i, weights[i+1], carry);
carry = 1;
// } else if (curWeightDigit == 3) {
// // carry = 1;
// carry = 1;
}
val /= 3;
// } else {
// break;
// }
}
if (leftPos == 0) {
printf("empty ");
} else {
for (int i = 0; i < leftPos; i++) {
if (i < leftPos - 1) {
printf("%d,", leftPart[i]);
} else {
printf("%d ", leftPart[i]);
}
}
}
for (int i = 0; i < rightPos; i++) {
if (i < rightPos - 1) {
printf("%d,", rightPart[i]);
} else {
printf("%d\n", rightPart[i]);
}
}
}
int caseNum;
int main() {
init();
scanf("%d", &caseNum);
for (int i = 1; i <= caseNum; i++) {
leftPos = 0;
rightPos = 0;
int val;
scanf("%d", &val);
solve(val);
}
}
进制转换题,3进制的。
思路就是将 转化完以后的3进制数里 数值为2 的位进行 加posie 使得最后的3进制数的数位数值只有1 和 0(因为每种posie只有一个,所以必须是0/1)