十六進制轉八進制

題目描述:

問題描述
  給定n個十六進制正整數,輸出它們對應的八進制數。

輸入格式
  輸入的第一行爲一個正整數n (1<=n<=10)。
  接下來n行,每行一個由0~9、大寫字母A~F組成的字符串,表示要轉換的十六進制正整數,每個十六進制數長度不超過100000。

輸出格式
  輸出n行,每行爲輸入對應的八進制正整數。

  【注意
  輸入的十六進制數不會有前導0,比如012A。
  輸出的八進制數也不能有前導0。

樣例輸入
  2
  39
  123ABC

樣例輸出
  71
  4435274

  提示
  先將十六進制數轉換成某進制數,再由某進制數轉換成八進制。

C++實現

#include<iostream>
#include<cstring>
using namespace std;

int main(){
	int n;
	cin>>n;
	string hex[n];
	string bin[n];
	for(int i=0;i<n;i++)
	cin>>hex[i];
	for(int j=0;j<n;j++)
	for(int i=0;i<hex[j].length();i++){
		switch(hex[j][i]){
			    case '0':bin[j] += "0000";break;
				case '1':bin[j] += "0001";break;
				case '2':bin[j] += "0010";break;
				case '3':bin[j] += "0011";break;
				case '4':bin[j] += "0100";break;
				case '5':bin[j] += "0101";break;
				case '6':bin[j] += "0110";break;
				case '7':bin[j] += "0111";break;
				case '8':bin[j] += "1000";break;
				case '9':bin[j] += "1001";break;
				case 'a':
				case 'A':bin[j] += "1010";break;
				case 'b':
				case 'B':bin[j] += "1011";break;
				case 'c':
				case 'C':bin[j] += "1100";break;
				case 'd':
				case 'D':bin[j] += "1101";break;
				case 'e':
				case 'E':bin[j] += "1110";break;
				case 'f':
				case 'F':bin[j] += "1111";break;
				default :break;
		}
	}
	
	//修正位數
	for(int i=0;i<n;i++){
		if(bin[i].length()%3==1)
			bin[i]="00"+bin[i];
		if(bin[i].length()%3==2)
			bin[i]="0"+bin[i];
		
	}
		
	//輸出八進制
	for(int j=0;j<n;j++){
		int flag = 0; 
		for(int i=0;i<bin[j].length();i=i+3){
				int x=(bin[j][i]-'0')*4+(bin[j][i+1]-'0')*2+(bin[j][i+2]-'0');
				if(x!=0)
					flag=1;
				if(flag==1)
					cout<<x;
		}
		cout<<endl;
	}
	return 0;
} 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章