C/C++进制转换

十六进制转八进制
十进制转任意进制
任意进制转十进制

十六进制转八进制

给定n个十六进制正整数,输出他们对应的八进制

输入格式

输入的第一行为一个正整数n(1 <= n <=10)

接下来n行,每行一个由0-9,A-F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000

注:

输入的十六进制不会有前导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位十六进制数;每三位二进制数转换为一位八进制数

    十六进制二进制八进制
    000000
    100011
    200102
    300113
    401004
    501015
    601106
    701117
    8100020
    9100121
    A101022
    B101123
    C110024
    D110125
    E111026
    F111127
    样例分析

    39 转换为二进制 0011(这是3),1001(这是9)

    二进制转八进制 000, 111( 这是7) , 001(这是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;
}

代码借鉴:https://blog.csdn.net/qsyzb/article/details/18891219

十进制转任意进制

解题思路:
十进制正整数转换成r进制采用:除r取余法,结果为余数逆序输出。

代码实现(1) :(十进制转二进制、八进制、十六进制)

void DecToBin(int);  //十进制转二进制
void DecToOct(int);  //十进制转八进制
void DecToHex(int);  //十进制转十六进制

int n;  //输入的十进制数

int main(){
    printf("Enter : "); 
    scanf("%d" , &n);

    if (n == 0){
        printf("0");
    }
    else
    {
        DecToBin(n);
        DecToOct(n);
        DecToHex(n);
    }

    return 0;   
}

void DecToBin(int n){
    int temp;
    int a[100];
    int i = 0; 

    while (n != 0)
    {
        temp = n;
        n = n / 2; 
        a[i] = temp % 2; 
        i++;
    }

    //逆序输出余数
    printf("BIN : ");
    int j;
    for ( j = i - 1; j >= 0; j--)
    {
        printf("%d",a[j]);
    }
    printf("\n");
}

void DecToOct(int n){
    int temp;
    int a[100];
    int i = 0; 

    while (n != 0)
    {
        temp = n;
        n = n / 8; //n此时是商
        a[i] = temp % 8; //a[count]是余数
        i++;
    }

    //逆序输出余数
    printf("OCT : ");
    int j;
    for ( j = i - 1; j >= 0; j--)
    {
        printf("%d",a[j]);
    }
    printf("\n");
}

void DecToHex(int n){
    int temp;
    int a[100];
    int i = 0; 

    while (n != 0)
    {
        temp = n;
        n = n / 16; 
        a[i] = temp % 16;
        i++;
    }

    //逆序输出余数
    printf("HEX : ");
    int j;
    for ( j = i - 1; j >= 0; j--)
    {
        //余数10~15用A、B、C……表示
        if (a[j] > 9 && a[j] < 16)
        {
            printf("%c",(a[j]-10+'A'));
        }
        else
        printf("%d",a[j]);
    }
    printf("\n");
}

代码实现(2): 十进制转任意进制

int main(){
    int n;  //输入的十进制数
    int r; //需要转换的进制数
    int temp;
    int a[100];
    int i = 0; 

    printf("Enter number : ");  
    scanf("%d" , &n);
    printf("Binary conversion : ");  //输入需要转换的进制
    scanf("%d" , &r);

    if (n == 0){
        printf("0");
    }

     while (n != 0)
    {
        temp = n;
        n = n / r; //n此时是商
        a[i] = temp % r; //a[count]是余数
        i++;
    }

    //逆序输出余数
    int j;
    if (r == 2 || r == 8){
        for ( j = i - 1; j >= 0; j--){
            printf("%d",a[j]);
        }
         
    }
    else{
        for ( j = i - 1; j >= 0; j--){
            if (a[j] > 9 && a[j] < 16)
                {
                    printf("%c",(a[j]-10+'A'));
                }
                else{
                     printf("%d",a[j]);
                }
            }
    }

    printf("\n");

    return 0;   
}

任意进制转十进制

解题思路:
r进制正整数转换成十进制数:r进制数的个位乘r的0次方+十位乘r的1次方…=十进制得数,以此类推即可

代码实现 :

int ToDEC(char a[],int r); //转换为十进制
int sum=0;

int main(){
    char a[100]; //需要转换的数 
    int r;  //进制类型

    printf("Enter hexadecimal type : ");
    scanf("%d",&r);
    printf("Enter number : ");
    scanf("%s",a);

    ToDEC(a,r);
    printf("DEC : ");
    printf("%d",sum);
    return 0;
}

 //转换为十进制
int ToDEC(char a[],int r){
    char *p = a;
    int len = strlen(p);
    int temp;

    while(len > 0){  
        if(*p >='0' && *p<='9')
        {
            //按权想加
            temp = (*p-'0') * pow(r,len-1); 
            sum = sum + temp;
        }

        if( (*p >= 'A' && *p <= 'F') || (*p >= 'a' && *p <= 'f'))
        {
            //把字母转换成数字按权相加
            temp = (*p-'A'+10) * pow(r,len-1);
            sum = sum + temp;
        }
        p++;
        len--;
    }
    return sum;
}
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值