蓝桥杯 基础练习 十六进制转八进制
基础练习 十六进制转八进制
时间限制: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
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
先将十六进制数转换成二进制数,再由二进制数转换成八进制。
我刚开始定义的char型字符数组 一直超时,看网上用的string定义的字符串就不超时,郁闷
超时代码
#include<stdio.h> #include<string.h> #include<string> #include<math.h> #include<algorithm> #define LL long long #define PI atan(1.0)*4 #define DD doublea #define MAX 100100 #define mod 10007 using namespace std; char a[MAX]; int p[MAX*10]; int main() { int n,m,j,i,len,sum; scanf("%d",&n); while(n--) { scanf("%s",&a); char s[MAX*10]=""; len=strlen(a); for(i=0;i<len;i++) //转化为二进制 { switch(a[i]) { case '0':strcat(s,"0000");break; case '1':strcat(s,"0001");break; case '2':strcat(s,"0010");break; case '3':strcat(s,"0011");break; case '4':strcat(s,"0100");break; case '5':strcat(s,"0101");break; case '6':strcat(s,"0110");break; case '7':strcat(s,"0111");break; case '8':strcat(s,"1000");break; case '9':strcat(s,"1001");break; case 'A':strcat(s,"1010");break; case 'B':strcat(s,"1011");break; case 'C':strcat(s,"1100");break; case 'D':strcat(s,"1101");break; case 'E':strcat(s,"1110");break; case 'F':strcat(s,"1111");break; default:break; } } //puts(s); strrev(s); int len1=strlen(s); if(len1%3==1) //因为二进制转八进制,是有三位二进制变为一位八进制 { //所以要补全,在前边补0使长度能整除3 strcat(s,"00"); len1+=2; } else if(len1%3==2) { strcat(s,"0"); len1+=1; } int op=1; for(i=0;i<len1-2;i+=3) //二进制转八进制 { p[op++]=(s[i]-'0')*1+(s[i+1]-'0')*2+(s[i+2]-'0')*4; } int flag=1; for(i=op;i>0;i--) { if(p[i]!=0) flag=0; if(p[i]==0&&flag) continue; printf("%d",p[i]); } printf("\n"); } return 0; }
AC代码:
#include<stdio.h> #include<string.h> #include<string> #include<math.h> #include<algorithm> #define LL long long #define PI atan(1.0)*4 #define DD doublea #define MAX 100100 #define mod 10007 using namespace std; int p[MAX*10]; int main() { int n,m,j,i,len,sum; scanf("%d",&n); while(n--) { string a,s; a.resize(MAX); //需要预先分配空间 scanf("%s",&a[0]); s=""; len=a.length();//字符串长度 for(i=0;i<len;i++) { switch(a[i]) { case '0':s+="0000";break; case '1':s+="0001";break; case '2':s+="0010";break; case '3':s+="0011";break; case '4':s+="0100";break; case '5':s+="0101";break; case '6':s+="0110";break; case '7':s+="0111";break; case '8':s+="1000";break; case '9':s+="1001";break; case 'A':s+="1010";break; case 'B':s+="1011";break; case 'C':s+="1100";break; case 'D':s+="1101";break; case 'E':s+="1110";break; case 'F':s+="1111";break; default:break; } } //puts(s); //strrev(s); int len1=s.length(); if(len1%3==1) { s="00"+s; //00+s是将00加在字符串前 s+00是将00加在字符串后 len1+=2; } else if(len1%3==2) { s="0"+s; len1+=1; } int op=1; for(i=0;i<len1-2;i+=3) { p[op++]=(s[i]-'0')*4+(s[i+1]-'0')*2+(s[i+2]-'0')*1; } int flag=1; for(i=0;i<op;i++) { if(p[i]!=0) flag=0; if(p[i]==0&&flag) continue; printf("%d",p[i]); } printf("\n"); } return 0; }