16 進数から 8 進数までのテスト問題の基本演習
リソースの制約
メモリ制限: 512.0MB C/C++ 時間制限: 1.0 秒 Java 時間制限: 3.0 秒 Python 時間制限: 5.0 秒
問題の説明
n 個の正の 16 進数整数が与えられた場合、それらに対応する 8 進数を出力します。
入力形式
入力の最初の行は、正の整数 n (1<=n<=10) です。
次の n 行、各行は 0 ~ 9 と大文字の A ~ F からなる文字列で、変換する 16 進数の正の整数を示し、各 16 進数の長さは 100000 を超えません。
出力形式
n 行を出力します。各行は 8 進数の正の整数入力に対応します。
[注意]
入力する 16 進数は、012A のように先頭に 0 が付きません。
また、出力の 8 進数には先行ゼロがあってはなりません。
サンプル入力
2
39
123ABC
サンプル出力
71
4435274
[プロンプト]
最初に 16 進数を特定の基数に変換し、次に特定の基数を 8 進数に変換します。
特定のアイデアは変換関数を与え、最初に16進数を整数に変換し、次に整数を8進数の文字列に変換します
変更機能を見てください
バージョン 1: 数値を中間プロセスとして使用するため、データが長すぎてまったく受信できません。
#include<iostream>
#include<vector>
#include<string>
#include<cmath>
#include<string>
#include<algorithm>
using namespace std;
string change(string& s)
{
string res;
long long num = 0;
int step = 0;
for (int i = s.size() - 1; i >= 0; i--)
{
switch (s[i])
{
case '1':
num += 1 * pow(16, step++);
break;
case '2':
num += 2 * pow(16, step++);
break;
case '3':
num += 3 * pow(16, step++);
break;
case '4':
num += 4 * pow(16, step++);
break;
case '5':
num += 5 * pow(16, step++);
break;
case '6':
num += 6 * pow(16, step++);
break;
case '7':
num += 7 * pow(16, step++);
break;
case '8':
num += 8 * pow(16, step++);
break;
case '9':
num += 9 * pow(16, step++);
break;
case 'A':
num += 10 * pow(16, step++);
break;
case 'B':
num += 11 * pow(16, step++);
break;
case 'C':
num += 12 * pow(16, step++);
break;
case 'D':
num += 13 * pow(16, step++);
break;
case 'E':
num += 14 * pow(16, step++);
break;
case 'F':
num += 15 * pow(16, step++);
break;
}
}
int m;
while (num)
{
m = num % 8;
num /= 8;
res += '0'+m;
// res += to_string(m);
}
reverse(res.begin(), res.end());
return res;
}
int main()
{
int n;
cin >> n;
vector<string> v(n);
vector<string> res(n);
for (int i = 0; i < n; i++)
{
cin >> v[i];
string temp = change(v[i]);
res[i] = temp;
}
for (int i = 0; i < n; i++)
{
cout << res[i];
cout << endl;
}
return 0;
}
【解決策2】16-"2-"8ベースを使う
#include <iostream>
using namespace std;
int main()
{
int n;
cin>>n;
for(int i=0; i<n; i++)
{
string tow;
string sixteen;
string eight;
cin>>sixteen;
for(int j=0; j<sixteen.length(); j++)
{
switch(sixteen[j])
{
case '0':tow+="0000";break;
case '1':tow+="0001";break;
case '2':tow+="0010";break;
case '3':tow+="0011";break;
case '4':tow+="0100";break;
case '5':tow+="0101";break;
case '6':tow+="0110";break;
case '7':tow+="0111";break;
case '8':tow+="1000";break;
case '9':tow+="1001";break;
case 'A':
case 'a':tow+="1010";break;
case 'B':
case 'b':tow+="1011";break;
case 'C':
case 'c':tow+="1100";break;
case 'D':
case 'd':tow+="1101";break;
case 'E':
case 'e':tow+="1110";break;
case 'F':
case 'f':tow+="1111";break;
}
}
if(tow.length()%3==1)
tow="00"+tow;
if(tow.length()%3==2)
tow="0"+tow;
if(!(tow[0]=='0'&&tow[1]=='0'&&tow[2]=='0'))
{
char temp;
temp = (tow[0]-'0')*4+(tow[1]-'0')*2+tow[2];
eight += temp;
}
for(int j=3; j<tow.length(); j+=3)
{
eight+=(tow[j]-'0')*4+(tow[j+1]-'0')*2+tow[j+2];
}
cout<<eight<<endl;
}
return 0;
}