题目描述
平衡三进制分别使用字符'-','0','1'表示-1,0,1。下表表示从0到10的十进制数对应的平衡三进制的值。
十进制 平衡三进制 0 0 1 1 2 1- 3 10 4 11 5 1-- 6 1-0 7 1-1 8 10- 9 100 10 101 现在给你一个十进制整数,请将其转成对应的平衡三进制的串。
输入
第一行是一个整数N,表示样例的个数。以后每行一个非负整数x,0≤x≤2^31-1。
输出
每行输出一个样例的结果。
样例输入
8 0 1 2 14 19 27 61 37726样例输出
0 1 1- 1--- 1-01 1000 1-1-1 1-0-1-1-1-1
解题思路:要做这题的平衡三进制,要先熟悉 普通的三进制。
普通三进制由 0、1、2 三个数表示,并且 逢3进一,当 当前位 为2时 加一 后需要进位,比如 12 + 1 = 13,3要进位,所以 12 + 1 = 20。(这里都是三进制数)
而平衡二进制是由 -1、0、1 三个数表示。用 -1 代替了 2,那当 三进制 要表示 2 的时候怎么办? 在10进制中,进行减法运算时,如果当低位不够减时,我们会从高位借个1出来,这个1的值就是10倍数。平衡三进制就采用同样的方法:(逆)借位。 先向高位进一位,同时在本位减去一个1,这样就能表示2啦(主动进1就相当于+3,然后本位减1,+3-1就等于2)。
比如 题目中 0 对应 0(加粗表示10进制数);1 对应 1; 2 就用 1- 表示 ( ‘-’ 对应 -1,1 在上一位,值等于 3)这就么一进位,然后再 减1,一加一减,就实现了 2 的表示。
同理 5 在普通三进制中 表示为 12,在平衡三进制中,2 要进位、减一,变成 2-,此时 1 因为进位变成了2,所以又要进位、减一。最后就有 5 = 1-- 。
懂得了平衡三进制的原理,现在就容易写题了。 当 x%3 == 0/1 时,就是普通的三进制,当 x%3 == 2时,记住我们要干嘛? 要进位,然后减一。 减一 就用 ‘-’表示,进位 在 x = x/3 屁股后面 + 1就行了。(自己理解下,偶尔还是要动动脑子的,而且很简单,动手模拟一下)
AC代码:
#include <stdio.h>
int N,x,cnt;
char base3[40];
void exchange()
{
cnt = 0, base3[0] = '0'; //初始化,如果n=0,则base3 = '0';
while (x)
{
if ( x%3 == 0) {base3[cnt++] = '0', x /= 3;}
else if ( x%3 == 1) {base3[cnt++] = '1', x /= 3;}
else {base3[cnt++] = '-', x = x/3+1;}
}
// 与第7、25行配合,如果不--,当n>0时,会从base3最后一位的下一位开始输出
if (cnt > 0) cnt --;
}
int main()
{
scanf("%d",&N);
while ( N --)
{
scanf("%d",&x);
exchange();
for (int i = cnt; i >= 0; i --)
printf("%c",base3[i]);
puts("");
}
return 0;
}