时间限制 内存限制
1000 ms 65536 KB

# 题目描述

道德经:“道生一,一生二,二生三,三生万物。”

33 是一个很玄妙的数字,卡皮巴拉给了你一个正整数,希望你用 33 的幂次将它表示出来。

比如,对于正整数 1919,我们可以表示为 19 = 3^0 + 2*3^2

# 输入

不定行输入,每行一个正整数 xx1x1091 \le x \le 10^9)。

# 输出

对于每一个 xx,输出一行,用 33 的幂次表示 xx

注意,对于某一项 a*3^i ,如果 a=0a = 0,则省略这一项;如果 a=1a = 1,则不输出 a* 。只有 =+ 与其他数字之间有一个空格。项的顺序按照幂次从小到大排列。

# 输入样例

2024
11
5

# 输出样例

2024 = 2*3^0 + 2*3^1 + 2*3^2 + 2*3^3 + 2*3^5 + 2*3^6 
11 = 2*3^0 + 3^2 
5 = 2*3^0 + 3^1

# 题解:进制转换

我们都知道,十进制转成其他进制可以不断进行短除,最后倒写余数即可。我们用程序模拟这一过程。

参考代码:

#include <stdio.h>
#include <stdbool.h>
int power;
bool isFirst = true;
void print(int x)
{
    if (x < 3)
    {
        if (isFirst)
        {
            if (x == 2)
                printf("2*3^%d", power);
            else
                printf("3^%d", power);
            isFirst = false;
        }
        else
        {
            if (x == 2)
                printf(" + 2*3^%d", power);
            else
                printf(" + 3^%d", power);
        }
            
        return;
    }
    if (x % 3 != 0)
    {
        if (isFirst)
        {
            if (x % 3 == 2)
                printf("2*3^%d", power);
            else
                printf("3^%d", power);
            isFirst = false;
        }
        else
        {
            if (x % 3 == 2)
                printf(" + 2*3^%d", power);
            else
                printf(" + 3^%d", power);
        }
    }
    ++ power;
    print(x / 3);
    return;
}
int main()
{
    // freopen("C.in", "r", stdin);
    // freopen("C.out", "w", stdout);
    int x;
    while (~scanf("%d", &x))
    {
        isFirst = true;
        power = 0;
        printf("%d = ", x);
        print(x);
        puts("");
    }
    return 0;
}