XTU-OJ 1141-平衡三进制2

题目描述

平衡三进制分别使用字符'-','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-,此时 1 因为进位变成了2,所以又要进位、减一。最后就有   5 = 1--  。

懂得了平衡三进制的原理,现在就容易写题了。 当 x%3 == 0/1 时,就是普通的三进制,当 x%3 == 2时,记住我们要干嘛? 要进位,然后减一。 减一 就用 ‘-’表示,进位 在 x = x/3 屁股后面 + 1就行了。(自己理解下,偶尔还是要动动脑子的,而且很简单,动手模拟一下)

AC代码:

#include 

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;
}

你可能感兴趣的:(湘大OJ练习解析,算法,数据结构,蓝桥杯)