码题集2190---三进制计算机2

 

 

长话短说,这道题就是求十进制怎么转换为平衡三进制(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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值