XTU-OJ 1141-平衡三进制2

题目描述

平衡三进制分别使用字符'-','0','1'表示-1,0,1。下表表示从0到10的十进制数对应的平衡三进制的值。

十进制平衡三进制
00
11
21-
310
411
51--
61-0
71-1
810-
9100
10101

现在给你一个十进制整数,请将其转成对应的平衡三进制的串。

输入

第一行是一个整数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 <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;
}

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值