【蓝桥】基础练习 十六进制转八进制

  基础练习 十六进制转八进制  
时间限制:1.0s   内存限制:512.0MB
       
问题描述
  给定n个十六进制正整数,输出它们对应的八进制数。

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

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

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

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

   提示
  先将十六进制数转换成某进制数,再由某进制数转换成八进制。

此题要用switch(否则超时)

if语句每次都需要判断,而switch则只判断一次,所以switch快,但也要看情况,一般5个选项(包括default)的情况下,switch和if/else if相同。低于5个选项if快,高于5给选项switch快。

1 两者本质的区别是if语句更适合于对区间(范围)的判断,而switch语句更适合于对离散值的判断。
2 示例
判断65分到85分之间的学生有哪些适合用if语句,因为[65,85]是区间。而判断一个学生的班级是一班、二班还是三班适合用switch语句,因为一班、二班、三班是离散值。
3 扩展
所有的switch语句都可以用if语句来替换(因为if语句只需对每个离散值分别做判断即可),而并不是所有的if语句都可以用switch语句来替换(因为区间里值的个数是无限的并且switch所接受的值只能是整型或枚举型,所以不能用case来一一列举)。



#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<string>
#include<queue>
#include<stack>
#include<vector>
#include<stdlib.h>
#include<algorithm>
using namespace std;
#define ms(a,b) memset(a,b,sizeof(a))
#define ll long long
#define pi acos(-1.0)

const int M=1e5+10;
int i,j,k,n,m;
char s[100100];
int T[400400];
int E[200200];
int main()
{
    scanf("%d",&n);
      while(n--){
        ms(s,'\0');
        scanf("%s",s);
        k=2;
        ms(T,0);
        ms(E,0);
        /*for(i=0;i<strlen(s);i++){
          if(s[i]=='0'){T[k++]=0,T[k++]=0,T[k++]=0,T[k++]=0;continue;}
          if(s[i]=='1'){T[k++]=0,T[k++]=0,T[k++]=0,T[k++]=1;continue;}
          if(s[i]=='2'){T[k++]=0,T[k++]=0,T[k++]=1,T[k++]=0;continue;}
          if(s[i]=='3'){T[k++]=0,T[k++]=0,T[k++]=1,T[k++]=1;continue;}
          if(s[i]=='4'){T[k++]=0,T[k++]=1,T[k++]=0,T[k++]=0;continue;}
          if(s[i]=='5'){T[k++]=0,T[k++]=1,T[k++]=0,T[k++]=1;continue;}
          if(s[i]=='6'){T[k++]=0,T[k++]=1,T[k++]=1,T[k++]=0;continue;}
          if(s[i]=='7'){T[k++]=0,T[k++]=1,T[k++]=1,T[k++]=1;continue;}
          if(s[i]=='8'){T[k++]=1,T[k++]=0,T[k++]=0,T[k++]=0;continue;}
          if(s[i]=='9'){T[k++]=1,T[k++]=0,T[k++]=0,T[k++]=1;continue;}
          if(s[i]=='A'){T[k++]=1,T[k++]=0,T[k++]=1,T[k++]=0;continue;}
          if(s[i]=='B'){T[k++]=1,T[k++]=0,T[k++]=1,T[k++]=1;continue;}
          if(s[i]=='C'){T[k++]=1,T[k++]=1,T[k++]=0,T[k++]=0;continue;}
          if(s[i]=='D'){T[k++]=1,T[k++]=1,T[k++]=0,T[k++]=1;continue;}
          if(s[i]=='E'){T[k++]=1,T[k++]=1,T[k++]=1,T[k++]=0;continue;}
          if(s[i]=='F'){T[k++]=1,T[k++]=1,T[k++]=1,T[k++]=1;continue;}
        }*/
        int l=strlen(s);
        for(i=0;i<l;i++)
            switch(s[i])
            {
                case '0':{T[k++]=0;T[k++]=0;T[k++]=0;T[k++]=0;}break;
                case '1':{T[k++]=0;T[k++]=0;T[k++]=0;T[k++]=1;}break;
                case '2':{T[k++]=0;T[k++]=0;T[k++]=1;T[k++]=0;}break;
                case '3':{T[k++]=0;T[k++]=0;T[k++]=1;T[k++]=1;}break;
                case '4':{T[k++]=0;T[k++]=1;T[k++]=0;T[k++]=0;}break;
                case '5':{T[k++]=0;T[k++]=1;T[k++]=0;T[k++]=1;}break;
                case '6':{T[k++]=0;T[k++]=1;T[k++]=1;T[k++]=0;}break;
                case '7':{T[k++]=0;T[k++]=1;T[k++]=1;T[k++]=1;}break;
                case '8':{T[k++]=1;T[k++]=0;T[k++]=0;T[k++]=0;}break;
                case '9':{T[k++]=1;T[k++]=0;T[k++]=0;T[k++]=1;}break;
                case 'A':{T[k++]=1;T[k++]=0;T[k++]=1;T[k++]=0;}break;
                case 'B':{T[k++]=1;T[k++]=0;T[k++]=1;T[k++]=1;}break;
                case 'C':{T[k++]=1;T[k++]=1;T[k++]=0;T[k++]=0;}break;
                case 'D':{T[k++]=1;T[k++]=1;T[k++]=0;T[k++]=1;}break;
                case 'E':{T[k++]=1;T[k++]=1;T[k++]=1;T[k++]=0;}break;
                case 'F':{T[k++]=1;T[k++]=1;T[k++]=1;T[k++]=1;}break;
            }
        int ff=0;
        for(j=k-1;j>=2;j-=3){
           E[ff++]=T[j]*1+T[j-1]*2+T[j-2]*4;
        }
        for(i=ff-1;i>=0;i--){
            if(!E[i]&&i==ff-1)continue;
            else printf("%d",E[i]);
        }
       printf("\n");
      }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值