蓝桥杯练习 十六进制转二进制

基础练习 十六进制转八进制  

时间限制:1.0s   内存限制:512.0MB

问题描述
  给定n个十六进制正整数,输出它们对应的八进制数。

输入格式
  输入的第一行为一个正整数n (1<=n<=10)。
  接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

输出格式
  输出n行,每行为输入对应的八进制正整数。

  【注意
  输入的十六进制数不会有前导0,比如012A。
  输出的八进制数也不能有前导0。

样例输入
  2
  39
  123ABC


样例输出
  71
  4435274

思路:十六进制转二进制再转八进制;

#include<iostream>
#include<algorithm>
#include<string.h>
#include<string>
using namespace std;
char s[100011];
int main()
{
        int n;
        string m;
        scanf("%d",&n);
        while(n--)
        {
                scanf("%s",s);//39
                m="";
                int i,len=strlen(s);
                //每一个十六位数字对应四个二进制数字
                /*  for(int i=strlen(s)-1;i>=0;i--){
                        if(s[i]>='0'&&s[i]<='9')
                                x=s[i]-'0';
                        else
                                x=s[i]-'A'+10;
                        for(int j=0;j<4;j++){
                                m+=x%2+'0';
                                x/=2;
                        }
                }算出的m是逆序的,所以推荐用下面的方法,直接利用*/
                for(i=0;i<len;i++){
                        switch(s[i])
                        {
                                case '0':m+="0000";break;case '1':m+="0001";break;
                                case '2':m+="0010";break;case '3':m+="0011";break;
                                case '4':m+="0100";break;case '5':m+="0101";break;
                                case '6':m+="0110";break;case '7':m+="0111";break;
                                case '8':m+="1000";break;case '9':m+="1001";break;
                                case 'A':m+="1010";break;case 'B':m+="1011";break;
                                case 'C':m+="1100";break;case 'D':m+="1101";break;
                                case 'E':m+="1110";break;case 'F':m+="1111";break;
                                default:break;
                        }
                }//m:00 111 001
                //补充0来使字符个数符合3的倍数
                if(m.length()%3==1)
                        m="00"+m;
                else if(m.length()%3==2)
                        m="0"+m;
                //m:000 111 001
                int p;
                bool flag=0;
                //每三个二进制换为一个八进制的数
                for(i=0;i<m.length()-2;i+=3){
                        p=4*(m[i]-'0')+2*(m[i+1]-'0')+m[i+2]-'0';//p:0 7 1
                        if(p)
                                flag=1;
                        if(flag)//排除前导零的情况
                                cout<<p;//printf("%d",p);//很迷为什么这里cout更省时
                }
                printf("\n");
        }
        return 0;
}

 

posted @ 2018-11-02 14:02  aeipyuan  阅读(766)  评论(0编辑  收藏  举报