题目
思路
在可达鸭数学中,只有1,-1,和0,但是十进制换三进制,只有0,1,2,所以要把2换成1*pow(3,1)+(-1)*pow(3,0),则在可达鸭数学中,2可以表示成1-1,即wm;
并且可达鸭数学中,负数与正数的区别就是正数的w与m位置互换,就为此数的负数,例如:8是:wbm;-8是:mbw
读入十进制的整数后,将十进制转换为三进制,不过存入数组中需逆序存放,这样好操作,然后数组遍历,如果为0,则字符数组存入b,若为1,则存入w,若为2,先存入m,再进位;
进位:此数为2,则先2-3=-1,然后后一个数+1;,
例如:三进制:2200,逆序之后:0022,则遍历的时候,字符数组第一步存入:b,第二步:bb,第三步(2变成1和-1,则2-3=-1):bbm,第四步(需要进位,则最后一个2变成2+1=3,然后再3-3=0):bbmb;第五步(还需再进一位,但此时的数是1):bbmbw;
注意:输出是逆序输出!
因为是逆序的,所以不需考虑前导零的情况
代码
#include <bits/stdc++.h>
using namespace std;
int main() {
int t;
cin >> t;
while (t--) {
int a[10000],a_i=0;
char b[10000],b_i=0;
int n, flag = 1;
cin >> n;
if (n == 0) {
cout << "b" << endl;
continue;
}
if (n == 1) {
cout << "w" << endl;
continue;
}
if (n == -1) {
cout << "m" << endl;
continue;
}
if (n < 0) {
n = -n;
flag = 0;
}
while(n)
{
a[a_i++]=(n%3);
n/=3;
}///三进制逆序读取
int f=0;///不需要进位
for(int i=0;i<a_i;i++)
{
if(!f)不需要进位
{
if(a[i]==1) b[b_i++]='w';
if(a[i]==0) b[b_i++]='b';
if(a[i]==2) b[b_i++]='m',f=1;
}
else需要进位
{
if(a[i]==1) b[b_i++]='m';需要进位
if(a[i]==0) b[b_i++]='w',f=0;
if(a[i]==2) b[b_i++]='b';需要进位
}
}
if(f==1) b[b_i++]='w';///若最后还需要进位
if(flag==0)///负数
{
for(int i=b_i-1;i>=0;i--)
{
if(b[i]=='w')
cout<<'m';
else if(b[i]=='m')
cout<<'w';
else
cout<<b[i];
}
}
else
{
for(int i=b_i-1;i>=0;i--)
cout<<b[i];
}
cout << endl;
}
return 0;
}
一开始想的是先将数字全部转变成1 ,-1,0,但是没改出来,写复杂了,直接将数字转变成字符,然后输出,少了一步转换会更好;考虑进位的时候没考虑全连续2进位的情况!