zoukankan      html  css  js  c++  java
  • 蓝桥杯练习 十六进制转二进制

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

    时间限制: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("
    ");
            }
            return 0;
    }
    
  • 相关阅读:
    C#学习-类型转换
    《学习之道》第八章总结
    《学习之道》第八章有了待办清单,重要的是说做就做
    《学习之道》第八章学习方法27薪水
    《学习之道》第八章行动日志是第二双眼睛
    C#学习-接口与抽象类
    C#学习-显式接口
    《学习之道》第八章再次提到休息
    《学习之道》第八章执行日志的经验
    4..8矩阵的乘法运算
  • 原文地址:https://www.cnblogs.com/aeipyuan/p/10079526.html
Copyright © 2011-2022 走看看