十六进制转八进制,十六进制转十进制

1.十六进制转八进制

见例题:
问题描述
  给定n个十六进制正整数,输出它们对应的八进制数。

输入格式
  输入的第一行为一个正整数n (1<=n<=10)。
  接下来n行,每行一个由09、大写字母AF组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

输出格式
  输出n行,每行为输入对应的八进制正整数。

【注意】
  输入的十六进制数不会有前导0,比如012A。
  输出的八进制数也不能有前导0。

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

【提示】
  先将十六进制数转换成某进制数,再由某进制数转换成八进制。

分析:多少了解点进制之间转换的朋友都知道 要用二进制作为中间值替换,即:先把十六进制转成二进制,每位十六进制正好转成4位二进制,然后再将二进制转成八进制,每三个二进制转成一个八进制。

那么用c++中的string类型或者java中的String类就更加的方便了,我本人对c++不是很熟,只自学了些基本的头文件和输入输出,大家可以看看这个链接:https://www.cnblogs.com/c1299401227/p/5370685.html

题解:
方法一:
适合数字比较小的情况下(显然就不适合这道题,所以我错了):
16进制:%x,8进制:%o

#include<stdio.h>
#define ll long long
int main(){
	int T,num;
	scanf("%d",&T);
	while(T--){
		scanf("%x",&num);
		printf("%o\n",num);
	}
	return 0;
}

方法二:
就是c++的string类型了:
转自:https://blog.csdn.net/qq_37962204/article/details/78628508

#include<string>
#include<cstdio>
#include<cmath>
#include<iostream>
using namespace std;
int main(){
	int n;
	string s1,s2;
	cin >> n;
	while(n--){
		cin >> s1;
		s2 = "";
		for(int i = 0;i<s1.length();i++){
			switch(s1[i]){
			case '0':s2 += "0000";break;
			case '1':s2 += "0001";break;
			case '2':s2 += "0010";break;
			case '3':s2 += "0011";break;
			case '4':s2 += "0100";break;
			case '5':s2 += "0101";break;
			case '6':s2 += "0110";break;
			case '7':s2 += "0111";break;
			case '8':s2 += "1000";break;
			case '9':s2 += "1001";break;
			case 'A':s2 += "1010";break;
			case 'B':s2 += "1011";break;
			case 'C':s2 += "1100";break;
			case 'D':s2 += "1101";break;
			case 'E':s2 += "1110";break;
			case 'F':s2 += "1111";break;
			default:break;
			}	 
		}
		//补成3的位数 
		if(s2.length()%3 == 1)      
			s2 = "00" + s2;
		if(s2.length()%3 == 2)
			s2 = "0" +s2;
		int sum = 0; 
		int flag = 0;   //flag的作用就是防止最后输出前导零 
		for(int j = 0;j<s2.length()-2;j +=3){ //-2
			//sum += 4*(s2[j+2]-'0') + 2*(s2[j+1]-'0') + (s2[j]-'0');
			sum = 4*(s2[j]-'0') + 2*(s2[j+1]-'0') + (s2[j+2]-'0');
			if(sum)
				flag = 1;
			if(flag)
				cout << sum;
		}
		cout << endl;
	}
	return 0;
}

2.十六进制转十进制

法一:

#include<stdio.h>
typedef long long ll ;
int main(){
	int num;
	scanf("%x",&num);
	printf("%lld\n",num);
	return 0;
}

法二:转自:https://blog.csdn.net/zhangjianjun521/article/details/79081435
建议进入链接看完整

#include <stdio.h>
#include <string.h>
 
/* 十六进制数转换为十进制数 */
long hexToDec(char *source);
 
/* 返回ch字符在sign数组中的序号 */
int getIndexOfSigns(char ch);
 
int main()
{
    char *hex = "75BCD15";
 
    printf("16进制数:\t%s\n", hex);
    printf("10进制数:\t%ld\n", hexToDec(hex));
 
    return 0;
}
 
/* 十六进制数转换为十进制数 */
long hexToDec(char *source)
{
    long sum = 0;
    long t = 1;
    int i, len;
 
    len = strlen(source);
    for(i=len-1; i>=0; i--)
    {
        sum += t * getIndexOfSigns(*(source + i));
        t *= 16;
    }  
 
    return sum;
}
 
/* 返回ch字符在sign数组中的序号 */
int getIndexOfSigns(char ch)
{
    if(ch >= '0' && ch <= '9')
    {
        return ch - '0';
    }
    if(ch >= 'A' && ch <='F') 
    {
        return ch - 'A' + 10;
    }
    if(ch >= 'a' && ch <= 'f')
    {
        return ch - 'a' + 10;
    }
    return -1;
}

相关推荐
©️2020 CSDN 皮肤主题: 技术工厂 设计师:CSDN官方博客 返回首页