基础练习 十六进制转八进制
时间限制:1.0s 内存限制:512.0MB
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
给定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;
}