蓝桥杯 进制转化c++

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

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

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

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

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

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

整体思路:

用字符串接收十六进制数,用对应函数转换为二进制数,存在字符串中
再用数学方法将其转化为对应的八进制数,存在vector中并打印

#include <iostream>
#include <string>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
using namespace std;
int main(int argc, char** argv) {
	int n;
	cin>>n;
	string hexToBin[10];
	string binToOct[10];
	string binstr[10];
	for(int i=0;i<n;i++){
		cin>>hexToBin[i];
	} 
	//十六进制转为二进制 
	for(int i=0;i<n;i++){
    // cout<<hexToBin[i].length()<<endl; //输出每个字符串长度 
		for(int j=0;j<hexToBin[i].length();j++){
			switch(hexToBin[i][j]){
				case '0' :  binstr[i]+="0000";break;
				case '1' :  binstr[i]+="0001";break;
				case '2' :  binstr[i]+="0010";break;
				case '3' :  binstr[i]+="0011";break;
				case '4' :  binstr[i]+="0100";break;
				case '5' :  binstr[i]+="0101";break;
				case '6' :  binstr[i]+="0110";break;
				case '7' :  binstr[i]+="0111";break;
				case '8' :  binstr[i]+="1000";break;
				case '9' :  binstr[i]+="1001";break;
				case 'A' :  binstr[i]+="1010";break;
				case 'B' :  binstr[i]+="1011";break;
				case 'C' :  binstr[i]+="1100";break;
				case 'D' :  binstr[i]+="1101";break;
				case 'E' :  binstr[i]+="1110";break;
				case 'F' :  binstr[i]+="1111";break;
			}
		}
	}
	
	for(int i=0;i<n;i++){
		int len = binstr[i].length();
		if(len%3==1){
			binstr[i].insert(0,"00");
		}
		if(len%3==2){
			binstr[i].insert(0,"0");
		}
//		cout<<binstr[i]<<endl;  输出二进制数 
		for(int j=0;j<len;j+=3){
			int num=0;
			for(int k=0;k<3;k++){
			//	binToOct,binstr  110 001,110 010 001
				switch(k){
					case 0: num += 4*(binstr[i][j+k]-'0');break;   // binstr[i]-'0' 不可以 
					case 1: num += 2*(binstr[i][j+k]-'0');break;
					case 2: num += (binstr[i][j+k]-'0');break;
				}				
			}
			binToOct[i]+=num+'0';	
		}
		//跳过前面的 0 
		// while (strOct[i][j++] == '0');
		//删除前面的 0 
		string::iterator it;
		for(it=binToOct[i].begin();it!=binToOct[i].end();++it){
			if(*it!='0'){
				break;
			}else{
				binToOct[i].erase(it);
			}
		}
		cout<<binToOct[i]<<endl;
	} 
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_42910523/article/details/88618014