第二十届同济大学程序设计竞赛(同步赛) A-可达鸭数学

A-可达鸭数学

题目描述:
人类数字是十进制的,因为人类有十根手指。
可达鸭数字是三进制的,因为可达鸭有三根呆毛。
与人类一样,可达鸭在书写数字的时候也是从左到右、从高位到低位。
不同于人类,可达鸭数学中只有三个数字:wmb,分别代表人类数学中的1-10
例如,可达鸭数字wmb换算成人类数字为: ( 1 ) × 3 2 + ( − 1 ) × 3 1 + ( 0 ) × 3 0 = 6 (1)\times3^2+(-1)\times3^1+(0)\times3^0=6 (1)×32+(1)×31+(0)×30=6,所以,wmb=6。
同理,我们有:
wmbbb=54
mbw=-8
wmbwwmw=520
wbmbmmbm=1907
mbwmbbwm=-2023
……
可达鸭很喜欢数学,为此他特意报名了今年下半年的国际宝可梦算数大赛(International Contest of Pokémon Calculation,简称 ICPC),但是他看不懂人类数字。作为他的好朋友,请你帮他把人类数字翻译成可达鸭数字。
输入描述:
第一行为一个整数 T ( 1 ≤ T ≤ 1 0 5 ) T (1 \le T \le 10^5) T(1T105),表示用例个数。
接下来 T T T 行,每行一个整数 x ( − 1 0 9 ≤ x ≤ 1 0 9 ) x(-10^9 \leq x \leq 10^9) x(109x109),表示一个人类十进制数字。
输出描述:
T T T 行,每行输出一个字符串 s s s,表示对应的可达鸭数字。该字符串不能含有除wmb之外的任何字符。
示例1
输入

9
1
-1
0
6
54
-8
520
1907
-2023

输出

w
m
b
wmb
wmbbb
mbw
wmbwwmw
wbmbmmbm
mbwmbbwm

备注:
请注意,在可达鸭数学里是没有负号的。
请注意,不要输出多余的前导 b,否则会被判 Wrong Answer。(例如,虽然 mwbmwbbbmw 表示的是同一个数,但输出 bmwbbbmw 会被判 Wrong Answer

题目大意:
其实就是进制转化,将十进制转化成三进制,不过这题不是普通的三进制,而是对称三进制。
(对称三进制:由 − 1 、 0 、 1 -1、0、1 101 组成,不过一般用 T T T 表示 − 1 -1 1,相对于普通的三进制,它不需要符号位来表示正负,实现原理就是题目描述给出的计算公式)
解题思路:
就是取余再除于的过程(从低位到高位),不过特殊的是对于余数的处理,和对下一位(高位)余数的处理。

  • x x x 为正数,当余数为 2 2 2 时,相当于对称三进制的 − 1 -1 1 ,就是减去了 3 对应位数 3^{对应位数} 3对应位数,那么就成了负数,所以要给下一位留一个余数 1 1 1 ,使其之后能加上 3 对应位数 3^{对应位数} 3对应位数,最后使得结果为正。
  • x x x 为负数,当余数为 − 2 -2 2 时,相当于对称三进制的 1 1 1 ,就是加上了 3 对应位数 3^{对应位数} 3对应位数,那么就成了正数,所以要给下一位留一个余数 − 1 -1 1 ,使其之后能减去 3 对应位数 3^{对应位数} 3对应位数,最后使得结果为负。
#include <bits/stdc++.h>
using namespace std;

int main()
{
    int t; cin>>t;
    while(t--)
    {
        string ans;
        int x; cin>>x;
        if(!x) ans = "b";
        else while(x) //从低位往高位算
        {
            int r = (x%3+3)%3; //1 和 -2 等价,2 和 -1 等价
            //正数x--不影响,影响的是负数
            //因为余数为 -2 时则是加上了 3^(对应位数), 整体为正
            //需要使得下一位的余数为 -1 那么才能减去 3^(对应位数),使得整体为负
            if(r == 1) ans = 'w' + ans, x--; //余数为 -2 时再 -1 能使高位能余个 -1 出来
            else if(r == 2) ans = 'm' + ans, x++; //反之,x++影响正数
            else ans = 'b' + ans;
            x /= 3;
        }
        cout<<ans<<'\n';
    }
    return 0;
}
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

花生ono

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值