题单地址:题单中心-东方博宜OJ
2 进制转换 8/16 进制使用方法是分组法:因为 3 位 2 进制数最大是 7,4 位 2进制最大是 15,分别满足 8 进制与 16 进制的性质,所以 3位2进制数 = 1位8进制数;4位2进制数 = 1位16进制数。
8/16 进制转换 2 进制使用方法是展开法:上面提到 3位2进制数 = 1位8进制数;4位2进制数 = 1位16进制数,所以每 1 位的 8/16 进制数都可以展开为对应的 2 进制位数。
问题描述
请将一个 100 位以内的 2 进制整数转换为 8 进制整数!
输入
100 位以内的二进制整数。
输出
该数对应的八进制整数。
样例
输入
111100001111000011110000
输出
74170360
解析:二进制从最低位开始,每3位代表八进制的1位数,再使用按权相加法计算该位数即可。注意:因为每3位二进制数是1位八进制数,使用要确保二进制的位数能够被3整除,在前面补0即可。
#include
using namespace std;
int main() {
string s, s1 = "";
cin >> s;
if(s.size() % 3 == 1)s = "00" + s;
else if(s.size() % 3 == 2)s = "0" + s;
for(int i = s.size()-1; i >= 0; i -= 3){
int ans = 1, n = 0;
for(int j = i; j > i-3; j--){
n = n + int(s[j] - '0') * ans;
ans *= 2;
}
s1 = char('0' + n) + s1;
}
cout << s1;
return 0;
}
问题描述
请将一个不超过 100 位的二进制数转换为十六进制数!
输入
一个不超过 100 位的二进制整数。
输出
该数对应的十六进制数。
样例
输入
11001001111011111000001000010011
输出
C9EF8213
解析:二进制从最低位开始,每4位代表十六进制的1位数,再使用按权相加法计算该位数即可。注意:因为每4位二进制数是1位十六进制数,使用要确保二进制的位数能够被4整除,在前面补0即可。
#include
using namespace std;
int main() {
string s, s1 = "";
cin >> s;
if(s.size() % 4 == 1)s = "000" + s;
else if(s.size() % 4 == 2)s = "00" + s;
else if(s.size() % 4 == 3)s = "0" + s;
for(int i = s.size()-1; i >= 0; i -= 4){
int ans = 1, n = 0;
for(int j = i; j > i-4; j--){
n = n + int(s[j] - '0') * ans;
ans *= 2;
}
if(n <= 9)s1 = char('0' + n) + s1;
else s1 = char('A' + (n - 10)) + s1;
}
cout << s1;
return 0;
}
问题描述
请将一个 100 位以内的 8 进制整数转换为 2 进制整数!
输入
100 位以内的 8 进制整数。
输出
该数对应的 2 进制整数。
样例
输入
12376532347173217361
输出
1010011111110101011010011100111001111011010001111011110001
解析:每1位八进制数可以转换为3位二进制数,使用除2取余法计算对应二进制即可。注意:有可能计算出来的二进制数不满3位,需要在前补0。
#include
using namespace std;
int main() {
string s, s1 = "";
cin >> s;
for(int i = s.size()-1; i >= 0; i--){
int n = s[i] - '0';
string s2 = "";
while(n){
s2 = char(n % 2 + '0') + s2;
n /= 2;
}
if(s[i] == '0')s2 = "0";
if(i != 0 && s2.size() == 1)s2 = "00" + s2;
else if(i != 0 && s2.size() == 2)s2 = "0" + s2;
s1 = s2 + s1;
}
cout << s1;
return 0;
}
问题描述
请将一个不超过 100 位的十六进制数转换为二进制数!
输入
一个不超过 100 位的十六进制整数。
输出
该数对应的二进制数。
样例
输入
123456789ABCDEF
输出
100100011010001010110011110001001101010111100110111101111
解析:每1位十六进制数可以转换为4位二进制数,使用除2取余法计算对应二进制即可。注意:有可能计算出来的二进制数不满4位,需要在前补0。
#include
using namespace std;
int main() {
string s, s1 = "";
cin >> s;
for(int i = s.size()-1; i >= 0; i--){
int n;
if(s[i] >= '0' && s[i] <= '9')n = s[i] - '0';
else n = s[i] - 'A' + 10;
string s2 = "";
while(n){
s2 = char(n % 2 + '0') + s2;
n /= 2;
}
if(s[i] == '0')s2 = "0";
if(i != 0 && s2.size() == 1)s2 = "000" + s2;
else if(i != 0 && s2.size() == 2)s2 = "00" + s2;
else if(i != 0 && s2.size() == 3)s2 = "0" + s2;
s1 = s2 + s1;
}
cout << s1;
return 0;
}
问题描述
输入一个不超过 100000 位的十六进制数,请转换成八进制数。
注:十六进制数中,字符 0−90−9 还对应表示数字 0−9,字母 A(大写)表示 10,B 表示11,…,F表示15。
比如:十六进制A10B表示的10进制数是:10×16^3+1×16^2+0×16^1+11×16^0=41227。
转换成八进制数是:120413,因为1×8^5+2×8^4+0×8^3+4×8^2+1×8^1+3×8^0=41227。
输入
一个十六进制数,没有前导 0 。
输出
一个八进制数,没有前导 0 。
样例
输入
123ABC
输出
4435274
解析:先将十六进制转换为二进制,再将二进制转换为八进制。
#include
using namespace std;
int main() {
string s, s1 = "";
cin >> s;
for(int i = s.size()-1; i >= 0; i--){
int n;
if(s[i] >= '0' && s[i] <= '9')n = s[i] - '0';
else n = s[i] - 'A' + 10;
string s2 = "";
while(n){
s2 = char(n % 2 + '0') + s2;
n /= 2;
}
if(s[i] == '0')s2 = "0";
if(i != 0 && s2.size() == 1)s2 = "000" + s2;
else if(i != 0 && s2.size() == 2)s2 = "00" + s2;
else if(i != 0 && s2.size() == 3)s2 = "0" + s2;
s1 = s2 + s1;
}
s = "";
if(s1.size() % 3 == 1)s1 = "00" + s1;
else if(s1.size() % 3 == 2)s1 = "0" + s1;
for(int i = s1.size()-1; i >= 0; i -= 3){
int ans = 1, n = 0;
for(int j = i; j > i-3; j--){
n = n + int(s1[j] - '0') * ans;
ans *= 2;
}
s = char('0' + n) + s;
}
cout << s;
return 0;
}