问题描述
给定n个十六进制正整数,输出他们对应的八进制
输入格式
输入的第一行为一个正整数n(1 <= n <=10)
接下来n行,每行一个由09,AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000
输出格式
输出n行,每行为输入对应的八进制正整数
注:
输入的十六进制不会有前导0,输出的八进制也没有前导0
样例输入
2
39
123ABC
样例输出
71
4435274
解题思路:
1.利用工具函数转换
-
包含iomanip头文件
-
输入/输出十进制数:dec;输入/输出十六进制数:hex;输入/输出八进制数:oct。
代码实现
include<iostream> using namespace std; int main() { int n; cin>>hex>>n; cout<<oct<<n<<endl; system("pause"); return 0; }
2.十六进制转二进制转八进制
-
先将十六进制转换成二进制,再将二进制转换成八进制
-
每四位二进制数,转换为1位十六进制数;每三位二进制数转换为一位八进制数
十六进制 二进制 八进制 0 0000 0 1 0001 1 2 0010 2 3 0011 3 4 0100 4 5 0101 5 6 0110 6 7 0111 7 8 1000 20 9 1001 21 A 1010 22 B 1011 23 C 1100 24 D 1101 25 E 1110 26 F 1111 27 样例分析
39 转换为二进制 0011,1001
? 这是3,这是9
二进制转八进制 000, 111 , 001
? 这是7,这是1
代码实现
#include <iostream> using namespace std; int main() { string tow; string sixteen; string eight; int n; cin>>n; for(int i=0; i<n; i++) { cin>>sixteen; //16进制转2进制 for(int j=0; j<sixteen.length(); j++) { switch(sixteen[j]) { case ‘0‘:tow+="0000";break; case ‘1‘:tow+="0001";break; case ‘2‘:tow+="0010";break; case ‘3‘:tow+="0011";break; case ‘4‘:tow+="0100";break; case ‘5‘:tow+="0101";break; case ‘6‘:tow+="0110";break; case ‘7‘:tow+="0111";break; case ‘8‘:tow+="1000";break; case ‘9‘:tow+="1001";break; case ‘A‘:tow+="1010";break; case ‘B‘:tow+="1011";break; case ‘C‘:tow+="1100";break; case ‘D‘:tow+="1101";break; case ‘E‘:tow+="1110";break; case ‘F‘:tow+="1111";break; } } // 不够三位用0补齐 if(tow.length()%3==1) tow="00"+tow; if(tow.length()%3==2) tow="0"+tow; //二进制转八进制 if(!(tow[0]==‘0‘&&tow[1]==‘0‘&&tow[2]==‘0‘)) { char temp; temp = (tow[0]-‘0‘)*4+(tow[1]-‘0‘)*2+tow[2]; eight += temp; } for(int j=3; j<tow.length(); j+=3) { eight+=(tow[j]-‘0‘)*4+(tow[j+1]-‘0‘)*2+tow[j+2]; } cout<<eight<<endl; } return 0; } //代码借鉴:https://blog.csdn.net/qq_40173649/article/details/86557725
3.十六进制转十进制转八进制
-
十六进制转十进制
各位数按权展开相加。
-
十进制转八进制
整体顺序、小数点不变,整数部分除8,余数逆序排列,小数部分乘8,整数逆序排列
样例分析:
十六进制39转十进制
3 * 16^1 + 9 = 57
十进制57转八进制
整体顺序、小数点不变,整数部分除8,余数逆序排列,小数部分乘8,整数逆序排列
57/8=7…1
7/8=0…7
结果为71
代码实现
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
//十六进制转十进制
long long hex_to_dec(string hex)
{
long long dec = 0;
int len = hex.length();
for(int i=0 ;i<len;i++)
{
//当所输入为A~F时,所输入字母减去A再加上10 便是所表示的10进制数
if(hex[i] >= ‘A‘ && hex[i] <= ‘F‘)
{
dec += (hex[i] - ‘A‘ + 10) * pow(16.0,len-1-i);
}
else
{
dec += (hex[i] - ‘0‘) * pow(16.0,len-1-i);
}
}
return dec;
}
//十进制转八进制
void dec_to_oct(long long dec)
{
char a[100];
long long s = dec;
int i = 0;
while(s / 8 != 0)
{
a[i++] = ‘0‘ + s % 8; //字符串连接
s = s / 8;
}
a[i] = ‘0‘ + s;
while(i >= 0)
{
cout<<a[i--]; // 逆序输出
}
}
int main()
{
string a[10];
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
for(int i=0;i<n;i++)
{
dec_to_oct(hex_to_dec(a[i]));
cout<<endl;
}
return 0;
}