ブルーブリッジカップ_16進法8進法

3020 ワード

    
    n        ,           。

    
              n (1<=n<=10)。
     n ,     0~9、    A~F      ,             ,            100000。

    
    n ,              。

  【  】
               0,  012A。
               0。

    
  2
  39
  123ABC

    
  71
  4435274

  【  】
                ,            。

 
最初、私がこのテーマを见た时、比较的简単だと思って、最初のコードは直接この2つの関数scanf("%x")、printf("%o")を使って、结果は提出して、0分、気がふさいで久しい....ネットで他人の解決策を知ってから、デバッグを経て、やっとこの問題を解決したので、ここでまとめるつもりです.
 
まず,タイトルに入力を要求する16進法の長さは100000を超えてはならず,この長さはlong longタイプでも収まらないので,入力した16進法データを文字列形式で格納することを優先する.各16進数データは4バイナリビットを占め、各8進数データは3バイナリビットを占める.ここでは入力した16進文字列を対応するバイナリ文字列に変換し、得られたバイナリ文字列を3つのグループごとに対応する8進文字列に変換し、出力します.
 
しかし、ここではいくつかの問題に注意しなければなりません.
1:バイナリから8進数に変換するのは3つのバイナリごとに1組なので、バイナリ文字列の長さが3の整数倍でない場合、文字列の前に対応する個数の“0”を足して、バイナリ文字列の長さを3の整数倍にします.
2:アップグレード処理の変換が完了したら、8進文字列の前の「0」文字を出力しないでください.(たとえば、8進文字列が071の場合、71として出力されるべきです).
 
コードは次のとおりです.
 
#include 
#include 
using namespace std;

int main(void)
{
	int n = 0;
	cin >> n;
	 
	string str_Hex, str_Bin;
	string *str_Oct = new string[n];
	
	for(int i = 0; i < n; i++)
	{
		str_Hex = "";
		str_Bin = "";
		str_Oct[i] = "";
		cin >> str_Hex;
		for(int j = 0; j < str_Hex.size(); j++)
		{
			switch(str_Hex[j])
			{
				case '0': str_Bin += "0000"; break;
				case '1': str_Bin += "0001"; break;
				case '2': str_Bin += "0010"; break;
				case '3': str_Bin += "0011"; break;
				case '4': str_Bin += "0100"; break;
				case '5': str_Bin += "0101"; break;
				case '6': str_Bin += "0110"; break;
				case '7': str_Bin += "0111"; break;
				case '8': str_Bin += "1000"; break;
				case '9': str_Bin += "1001"; break;
				case 'A': str_Bin += "1010"; break;
				case 'B': str_Bin += "1011"; break;
				case 'C': str_Bin += "1100"; break;
				case 'D': str_Bin += "1101"; break;
				case 'E': str_Bin += "1110"; break;
				case 'F': str_Bin += "1111"; break;
				default: break;
			}
		}
		
		//           '0',       3     
		if((str_Bin.size() % 3) == 1)
			str_Bin = "00" + str_Bin;
		if((str_Bin.size() % 3) == 2)
			str_Bin = "0" + str_Bin;
					
		int d = 0;
		for(int k = 0; k < str_Bin.size(); k += 3)
		{
			//  3               
			d = 4*(str_Bin[k] - '0') + 2*(str_Bin[k+1] - '0') + (str_Bin[k+2] - '0');
			str_Oct[i] += (d + '0');
		}
	}
	
	for(int i = 0; i < n; i++)
	{
		//       '0'   
		int k = 0;	
		while(str_Oct[i][k] == '0') 
			k++;
			
		cout << &str_Oct[i][k] << endl;
	}
	
	delete []str_Oct;
	str_Oct = NULL;
	return 0;
}