蓝桥——基础练习——16进制转8进制

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

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

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

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

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

代码:

#include <iostream>  
#include <string>
using namespace std;
int arr[10][4000000];//每个十六进制数长度不超过100000。
                      //输入的十六进制数不会有前导0,比如012A。
                      //输出的八进制数也不能有前导0。
int main03()
{
	int n, count[10] = {0}; //1<=n<=10  count用于记录每次输入的16进制转化成的8进制数有几位 
	string str, str2;       //str用于存储输入的16进制, str2用于存储转化后的2进制 
				
	cin >> n;

	for(int j = 0; j < n; j++){
		cin >> str;
		
		for(int i = 0; i < str.length(); i++){	
			switch(str[i]){	
				case '0':str2+="0000";break;//注意引号和单引号 
				case '1':str2+="0001";break;
				case '2':str2+="0010";break;
				case '3':str2+="0011";break;
				case '4':str2+="0100";break;
				case '5':str2+="0101";break;
				case '6':str2+="0110";break;
				case '7':str2+="0111";break;
				case '8':str2+="1000";break;
				case '9':str2+="1001";break;
				case 'A':str2+="1010";break;
				case 'B':str2+="1011";break;
				case 'C':str2+="1100";break;
				case 'D':str2+="1101";break;
				case 'E':str2+="1110";break;
				case 'F':str2+="1111";break;
				default:break;				
			}
		}
		
		//补零  因为转换成的2进制数时必须是3的倍数,后面才能进一步转换成8进制 
		if(str2.length() % 3 == 1)      str2 = "00" + str2;
		else if(str2.length() % 3 == 2) str2 = "0"  + str2;
	
		//2 转 8 
		for(int i = 0; i < str2.length(); i += 3){
			arr[j][count[j]++] = (str2[i] - '0')*4 + (str2[i+1] - '0')*2 + (str2[i+2] - '0');	
			
		}
		str2 = "";//每次str2用了要清零 		
	}
	
	for(int j = 0; j < n; j++){
		for(int i = 0; i < count[j]; i++){
			if(i == 0 && arr[j][i] == 0) continue;//考虑16进制输入0的情况  0000 --> 000 000 
			cout << arr[j][i];		
		}
		cout << endl;
	}
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/rakish_wind/article/details/84176623