给定n个十六进制正整数,输出他们对应的八进制
输入的第一行为一个正整数n(1 <= n <=10)
接下来n行,每行一个由09,AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000
输出n行,每行为输入对应的八进制正整数
输入的十六进制不会有前导0,输出的八进制也没有前导0
样例输入
2
39
123ABC
样例输出
71
4435274
包含iomanip头文件
输入/输出十进制数:dec;输入/输出十六进制数:hex;输入/输出八进制数:oct。
代码实现
include<iostream>
using namespace std;
int main()
{
int n;
cin>>hex>>n;
cout<<oct<<n<<endl;
system("pause");
return 0;
}
先将十六进制转换成二进制,再将二进制转换成八进制
每四位二进制数,转换为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
十六进制转十进制
各位数按权展开相加。
十进制转八进制
整体顺序、小数点不变,整数部分除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;
}
原文:https://www.cnblogs.com/l574/p/15007266.html