蓝桥杯 BASIC-12 十六进制转八进制
十六进制转八进制
时间限制:1.0s 内存限制:512.0MB
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0 ~9 、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
题目网址(http://lx.lanqiao.cn/problem.page?gpid=T51)
题意:
本题要求将16进制数变为8进制数;其中先输入一个整数n,然后在输入n组数据,再对每组数据进行进制转换
思路
对于每组数据,可以先把16进制转换为2进制,就是每一位16进制数可以变为四个二进制数,然后再有每三个二进制数变为一个8进制数
代码
#include<iostream>
#include<stdio.h>
#include<string> //字符串头文件
using namespace std;
int main()
{
int n,i,j;
string a,b;
cin>>n; //输入整数n
for(i=0;i<n;i++)
{
a=""; //对字符串清空
b="";
cin>>a; //输入字符串
//将16进制转换为二进制
for(j=0;j<a.length();j++)
{
if(a[j]=='0')
b.append("0000"); //将转换的二进制存到字符串b中,添加到字符串尾部
else if(a[j]=='1')
b.append("0001");
else if(a[j]=='2')
b.append("0010");
else if(a[j]=='3')
b.append("0011");
else if(a[j]=='4')
b.append("0100");
else if(a[j]=='5')
b.append("0101");
else if(a[j]=='6')
b.append("0110");
else if(a[j]=='7')
b.append("0111");
else if(a[j]=='8')
b.append("1000");
else if(a[j]=='9')
b.append("1001");
else if(a[j]=='A')
b.append("1010");
else if(a[j]=='B')
b.append("1011");
else if(a[j]=='C')
b.append("1100");
else if(a[j]=='D')
b.append("1101");
else if(a[j]=='E')
b.append("1110");
else if(a[j]=='F')
b.append("1111");
}
//将前面的0去掉
for(;;)
{
if(b[0]=='0')
{
b.erase(b.begin()); //删除字符串的第一位
}
else
break;
}
//字符串的元素个数不是3的倍数的前面补0
if(b.length()%3==1)
{
b="00"+b;
}
else if(b.length()%3==2)
{
b="0"+b;
}
//将二进制转换为8进制并输出
for(j=0;j<b.length();j=j+3)
{
if(b[j]=='0'&&b[j+1]=='0'&&b[j+2]=='0')
printf("0");
else if(b[j]=='0'&&b[j+1]=='0'&&b[j+2]=='1')
printf("1");
else if(b[j]=='0'&&b[j+1]=='1'&&b[j+2]=='0')
printf("2");
else if(b[j]=='0'&&b[j+1]=='1'&&b[j+2]=='1')
printf("3");
else if(b[j]=='1'&&b[j+1]=='0'&&b[j+2]=='0')
printf("4");
else if(b[j]=='1'&&b[j+1]=='0'&&b[j+2]=='1')
printf("5");
else if(b[j]=='1'&&b[j+1]=='1'&&b[j+2]=='0')
printf("6");
else if(b[j]=='1'&&b[j+1]=='1'&&b[j+2]=='1')
printf("7");
}
printf("\n");
}
}
运行结果:
总结:
这个题只要理解16进制转成二进制再由二进制转成8进制就好写了,不过里面要注意一些事项,就是字符串在尾部添加元素的时候最好用append();因为用b=b+“元素”,比较耗时间,提交很有可能会时间超限。