时间限制 | 内存限制 |
---|---|
1000 ms |
65536 KB |
# 题目描述
道德经:“道生一,一生二,二生三,三生万物。”
是一个很玄妙的数字,卡皮巴拉给了你一个正整数,希望你用 的幂次将它表示出来。
比如,对于正整数 ,我们可以表示为 19 = 3^0 + 2*3^2
。
# 输入
不定行输入,每行一个正整数 ()。
# 输出
对于每一个 ,输出一行,用 的幂次表示 。
注意,对于某一项 a*3^i
,如果 ,则省略这一项;如果 ,则不输出 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; | |
} |