上文链接:蓝桥杯之圆的面积(c++实现)
资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
代码展示
#include <iostream>
#include <string>
using namespace std;
int main()
{
int n = 0, i = 0, j = 0, temp = 0, count = 0;
string hexmodel[] = {"0000","0001","0010","0011","0100","0101","0110","0111","1000","1001","1010","1011","1100","1101","1110","1111"};
string hex[10]; //十六进制
string bin[10]; //二进制
string oct[10]; //八进制
//输入十六进制数
cin>>n;
for (i = 0; i < n; ++i)
{
cin>>hex[i];
}
//十六进制转换二进制
for (i = 0; i < n; ++i)
{
j = 0;
while (hex[i][j])
{
//判断是否为A-F,是则匹配hexmodel对应10-15位置,否则匹配对应0-9位置
if(hex[i][j]-'A'>=0&&hex[i][j]-'A'<=5) bin[i]+=hexmodel[(hex[i][j]-'A')+10];
else bin[i]+=hexmodel[(hex[i][j]-'0')];
++j;
}
}
//二进制转换为八进制
for (i = 0; i < n; ++i)
{
j = bin[i].size()-1;//获取二进制的字符长度
while (bin[i][j] && j>=0)
{
temp = 3;//设定十六进制中每三位为八进制的一位数
count = 0;//初始化八进制的一位数为0
//十六进制数中每三位
while (temp-- && j>=0)
{
if ('1' == bin[i][j])
{
switch(temp)
{
case 0: count += 4; break;
case 1: count += 2; break;
case 2: count += 1; break;
default:break;
}
}
--j;
}
oct[i] += (count+'0');
}
}
//打印
for (i = 0; i < n; ++i)
{
j = oct[i].size()-1;
while (oct[i][j] == '0')j--;//跳过最高位的0
for(;j>=0;j--)
{
cout<<oct[i][j]-'0';
}
cout<<endl;
}
return 0;
}
该算法之我的总结
- 利用modelhex自定义数组进行十六进制转换二进制的匹配,节省匹配时间
- 十六进制转八进制时,注意到十六进制字符长度为4的倍数,八进制字符长度为3的倍数。所以采用对十六进制的每一位数判断并每三位累加,不足三位时利用temp计数变量判断剩余位并进行赋值运算。
- 应注意到十六进制转二进制,二进制到八进制的过程中,最高位与最低位的变化。