十六进制转八进制

问题描述

给定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;
}
posted @ 2021-07-13 16:59  小芦荟同学  阅读(2908)  评论(0编辑  收藏  举报