ZCMU - 2158: G.ly的进制转换

题目链接:点击打开链接


题目大意:略。


解题思路:先整合16 To 2进制,注意补位为3的倍数(8进制),然后循环 i+=3 来跑完,前导0省略


AC 代码

#include<bits/stdc++.h>
#include<cmath>

#define mem(a,b) memset(a,b,sizeof a);

using namespace std;

typedef long long ll;

const int mlen=100000+100;

char a[mlen];

int main()
{
//    const string letrr[6]={"1010","1011","1100","1101","1110","1111"};
//    const string numrr[10]={"0000","0001","0010","0011","0100","0101","0110","0111","1000","1001"};
    int T; scanf("%d",&T);
    T>10?T=10:T;
    while(T-- && ~scanf("%s",a))
    {
        string txt;
        int len=strlen(a);
        int t=len*4%3,tlen=0;
        if(t==0) txt="";
        else if(t==1) txt="00",tlen=2;
        else if(t==2) txt="0",tlen=1;

        for(int i=0;i<len;i++) // 这里不要用 a[i]-'0' 操作,会TLE,因为数据量太大
        {
            switch(a[i])
            {
                case '0':txt+="0000";break;
                case '1':txt+="0001";break;
                case '2':txt+="0010";break;
                case '3':txt+="0011";break;
                case '4':txt+="0100";break;
                case '5':txt+="0101";break;
                case '6':txt+="0110";break;
                case '7':txt+="0111";break;
                case '8':txt+="1000";break;
                case '9':txt+="1001";break;
                case 'A':txt+="1010";break;
                case 'B':txt+="1011";break;
                case 'C':txt+="1100";break;
                case 'D':txt+="1101";break;
                case 'E':txt+="1110";break;
                case 'F':txt+="1111";break;
            }
        }

        len=len*4+tlen;
        for(int i=0;i<len;i+=3)
        {
            if(txt[i]=='0'&&txt[i+1]=='0'&&txt[i+2]=='0')
            {
                if(i==0) continue;
                else printf("0");
            }
            else if(txt[i]=='0'&&txt[i+1]=='0'&&txt[i+2]=='1') printf("1");
            else if(txt[i]=='0'&&txt[i+1]=='1'&&txt[i+2]=='0') printf("2");
            else if(txt[i]=='0'&&txt[i+1]=='1'&&txt[i+2]=='1') printf("3");
            else if(txt[i]=='1'&&txt[i+1]=='0'&&txt[i+2]=='0') printf("4");
            else if(txt[i]=='1'&&txt[i+1]=='0'&&txt[i+2]=='1') printf("5");
            else if(txt[i]=='1'&&txt[i+1]=='1'&&txt[i+2]=='0') printf("6");
            else if(txt[i]=='1'&&txt[i+1]=='1'&&txt[i+2]=='1') printf("7");
        }
        puts("");
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/dream_weave/article/details/80700562