跳转至

平衡三进制

也称为对称三进制。数字由 -1, 0, 1 构成的。

模版

先将十进制转化为普通三进制,再从低位开始,遇到 2 则 改为 -1 且将下一位 +1,遇到 3 则 改为 0 且将下一位 + 1

C++
int n;
cin >> n;
bool sign = true;
if (n < 0) {
    sign = false;
    n = -n;
}
vector<int> nums;
int temp = n;
while (temp) {
    nums.emplace_back(temp % 3);
    temp /= 3;
}
nums.emplace_back(0);
int len = nums.size();
for (int i = 0 ; i < len ; i++) {
    if (nums[i] == 3) {
        nums[i] = 0;
        nums[i + 1]++;
    } else if (nums[i] == 2) {
        nums[i] = -1;
        nums[i + 1]++;
    }
}
reverse(begin(nums), end(nums));
if (sign == false) {
    for (int i = 0 ; i < len ; i++) {
        nums[i] = -nums[i];
    }
}
bool has = false;
for (int i = 0 ; i < len ; i++) {
    if (nums[i] == 0) {
        if (has || i == len - 1) {
            cout << nums[i] << " ";
        }
    } else {
        has = true;
        cout << nums[i] << " ";
    }
}
例题

U313611 【模板】平衡三进制 - 洛谷