基础练习 十六进制转八进制
时间限制: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
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
解题思路:利用十六进制和二进制以及二进制和八进制的关系,将二进制作为一个桥梁,先将十六进制转化成二进制,然后再转化成八进制,就可以了;
值得注意的是当转化成二进制时,如果用字符串拼接函数是会运行超时的,所以要用string。。
超时代码:
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<string>
using namespace std;
const int maxn=100001;
char s[maxn],c[maxn*4];
int b[maxn*2];
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
scanf("%s",s);
int l=strlen(s);
memset(c,0,sizeof(0));
for(int i=0; i<l; i++)//转化成二进制
{
if(s[i]=='0') strcat(c,"0000");
else if(s[i]=='1') strcat(c,"0001");
else if(s[i]=='2') strcat(c,"0010");
else if(s[i]=='3') strcat(c,"0011");
else if(s[i]=='4') strcat(c,"0100");
else if(s[i]=='5') strcat(c,"0101");
else if(s[i]=='6') strcat(c,"0110");
else if(s[i]=='7') strcat(c,"0111");
else if(s[i]=='8') strcat(c,"1000");
else if(s[i]=='9') strcat(c,"1001");
else if(s[i]=='A') strcat(c,"1010");
else if(s[i]=='B') strcat(c,"1011");
else if(s[i]=='C') strcat(c,"1100");
else if(s[i]=='D') strcat(c,"1101");
else if(s[i]=='E') strcat(c,"1110");
else if(s[i]=='F') strcat(c,"1111");
}
int l1=strlen(c);
int t=l1%3,j=0;
if(t==1) b[j++]=c[0]-'0';
else if(t==2) b[j++]=(c[0]-'0')*2+(c[1]-'0');
for(int i=t; i<l1; i=i+3)
b[j++]=(c[i]-'0')*4+(c[i+1]-'0')*2+(c[i+2]-'0');
int g;
for(g=0; g<j; g++)
if(b[g]!=0) break;
for(int h=g;h<j;h++)
printf("%d",b[h]);
printf("\n");
}
return 0;
}
正确代码:
#include<stdio.h>
#include<iostream>
#include<string.h>
using namespace std;
const int maxn=100005;
char s[maxn];
int f(char s)
{
return s-'0';
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
string s1="";
scanf("%s",s);
int l=strlen(s);
for(int i=0; i<l; i++)//转化成二进制
{
if(s[i]=='0') s1+="0000";
else if(s[i]=='1') s1+="0001";
else if(s[i]=='2') s1+="0010";
else if(s[i]=='3') s1+="0011";
else if(s[i]=='4') s1+="0100";
else if(s[i]=='5') s1+="0101";
else if(s[i]=='6') s1+="0110";
else if(s[i]=='7') s1+="0111";
else if(s[i]=='8') s1+="1000";
else if(s[i]=='9') s1+="1001";
else if(s[i]=='A') s1+="1010";
else if(s[i]=='B') s1+="1011";
else if(s[i]=='C') s1+="1100";
else if(s[i]=='D') s1+="1101";
else if(s[i]=='E') s1+="1110";
else if(s[i]=='F') s1+="1111";
}
int ll=s1.length();
if(ll%3 == 1) s1 = "00" + s1;//若长度不是3的倍数,则加上相应个数的‘0’
else if(ll%3 == 2) s1 = "0" + s1;
ll=s1.length();
//cout<<s1<<ll<<endl;
for(int g=0; g<ll-2; g+=3){//每三位二进制相当于一位八进制
int num = f(s1[g])*4 + f(s1[g+1])*2 + f(s1[g+2]);
if(!g && !num) continue;
printf("%d", num);
}
printf("\n");
}
return 0;
}