长话短说,这道题就是求十进制怎么转换为平衡三进制(0/1/2)
想做对该题,你需要知道两点:
1.首先是正数怎么转换,规则如下:
先转换为普通的三进制,再从后向前依次遍历每一位,如果为0或1,则不变;如果为2,则将该位变为-1,前一位+1。
举个例子:
5的普通三进制为21(3)。那么最后一位为1,不变;倒数第二位为2,变为-1,倒数第三位加1。那么,5的平衡三进制为1 -1 1。
2.负数转换后和正数转换后有什么关联?
答案是负数转换后为1的地方变为-1,-1的地方变为1则对应着正数转换后的数。
举个例子:
2的平衡三进制为1 -1,那么就可以知道-2的平衡三进制为-1 1。
自己去尝试写一下代码吧~
这道题非常卡时。。。scanf !!!!!!!! printf !!!!!!!!!
#include<bits/stdc++.h>
using namespace std;
int n;
int main( )
{
scanf("%d",&n);
for(int t=1;t<=n;t++){
int temp;
scanf("%d",&temp);
if(temp==0){cout<<0<<endl;continue;}
int flag=0;//正数--0,负数--1
if(temp<0){flag=1;temp=-temp;}
int res[100]={0};
int cnt=99;//从99开始记录
//从99位置开始存储
while(temp!=0){
res[cnt--]=temp%3;
temp/=3;
}
cnt++;//处理好的余数从cnt开始,一直到99
for(int i=99;i>=cnt;i--){//依次处理数组中的每一位
if(res[i]==0||res[i]==1){continue;}
else if(res[i]==2){res[i]=-1;res[i-1]++;}
else{
res[i-1]+=res[i]/3;
res[i]=res[i]%3;
}
}
if(res[cnt-1]!=0){cnt--;}
if(flag){//负数
for(int i=cnt;i<=99;i++){
if(res[i]==0){printf("0");}
else if(res[i]==1){printf("-");}
else{
printf("1");
}
}
}
else{
for(int i=cnt;i<=99;i++){
if(res[i]==-1){printf("-");}
else{
printf("%d",res[i]);
}
}
}
printf("\n");
}
return 0;
}