【蓝桥杯】基础练习 十六进制转八进制

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

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

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

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

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

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

#include <iostream>
#include <algorithm>
#include <cstdio>
#include <string>
#include <string.h>
using namespace std;

int main(){
	
	int n;
	scanf("%d",&n);
	
	while(n--){
		
		string hex; //十六进制
		string oct; //八进制
		string to; //二进制
		
		cin>>hex;
		
		for(int i=0;i<hex.length();i++){
			switch(hex[i]){
				case '0': to+="0000";
						  break;
				case '1': to+="0001";
						  break;
				case '2': to+="0010";
						  break;
				case '3': to+="0011";
						  break;
				case '4': to+="0100";
						  break;
				case '5': to+="0101";
						  break;
				case '6': to+="0110";
						  break;
				case '7': to+="0111";
						  break;
				case '8': to+="1000";
					      break;
				case '9': to+="1001";
						  break;
				case 'A': to+="1010";
					      break;
				case 'B': to+="1011";
				          break;
				case 'C': to+="1100";
						  break;
				case 'D': to+="1101";
						  break;
				case 'E': to+="1110";
				          break;
				case 'F': to+="1111";
					      break;
				default: 
						  break;
			}
		}
		
		if(to.length()%3==1){
			to.insert(0,"00");
		}
		else if(to.length()%3==2){
			to.insert(0,"0");
		}
		
		for(int i=0;i<to.length();i+=3){
			int res = (to[i] - '0') * 4 + (to[i+1] - '0') * 2 + (to[i+2] - '0');
			if(res==0 && i==0) continue;
			cout<<res;
		}
		cout<<endl;
	}
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41700374/article/details/86505691