进制转换(2互转8/16)(1293. 二进制转换八进制、1294. 二进制转十六进制、1359. 八进制转换二进制、1306. 十六进制转二进制、1295. 十六进制转换)

题单地址:题单中心-东方博宜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 进制位数。

1293. 二进制转换八进制

问题描述

请将一个 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;
}

1294. 二进制转十六进制

问题描述

请将一个不超过 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;
}

1359. 八进制转换二进制

问题描述

请将一个 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;
}

1306. 十六进制转二进制

问题描述

请将一个不超过 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;
}

1295. 十六进制转换

问题描述

输入一个不超过 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;
}

你可能感兴趣的:(东方博宜OJ题库解析,c++)