問題描述
給定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;
}