十六進制轉八進制


問題描述

給定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 轉換為二進制 00111001

    ​ 這是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;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM