ブルーブリッジカップ_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;
}