【算法】1090: 十六进制转换

【算法】1090: 十六进制转换

这个题目实现起来不是很难,因为一位16进制数可以用4位二进制数来表示,一位8进制数可以用3位二进制数来表示,这样通过二进制数便在16进制数和8进制数之间架起了桥梁。

这里我直接采用C++中的string类来写,方便快捷,可行性高,但有些地方需要注意,有些地方仍然值得在以后的编程中借鉴,且看代码:

#include<string>
#include<iostream>
using namespace std;
int main()
{
	string s1;
	cin >> s1;
	if (s1 == "0") {
		cout << 0 << endl;
		return 0;
	}
	string s2;
	for (int i = 0; i < s1.length(); i++) {
		switch (s1[i])
		{
		case '0':s2 += "0000"; break;
		case '1':s2 += "0001"; break;
		case '2':s2 += "0010"; break;
		case '3':s2 += "0011"; break;
		case '4':s2 += "0100"; break;
		case '5':s2 += "0101"; break;
		case '6':s2 += "0110"; break;
		case '7':s2 += "0111"; break;
		case '8':s2 += "1000"; break;
		case '9':s2 += "1001"; break;
		case 'A':s2 += "1010"; break;
		case 'B':s2 += "1011"; break;
		case 'C':s2 += "1100"; break;
		case 'D':s2 += "1101"; break;
		case 'E':s2 += "1110"; break;
		case 'F':s2 += "1111"; break;
		default:
			break;
		}
	}
	int L2 = s2.length();
	if (L2 % 3 == 1) {// 判断是否需要添加前缀0  
		s2 = "00" + s2;
	}else if(L2 % 3 == 2) {
		s2 = "0" + s2;
	}
	bool flag = false;
	for (int i = 0; i <= s2.length() - 3; i += 3)
	{
		int num = 4 * (s2[i] - '0') + 2 * (s2[i + 1] - '0') + (s2[i + 2] - '0');
		if (num) {// 这里的做法值得记住
			flag = true;//忽略前导0-->直到找到第一个不为0的将flag变为true 然后flag一直为true,即使后面有0出现也要将0输出
		}				
		if (flag)
			cout << num;
	}
	cout << endl;
	return 0;
}

在以后的编程中要善于用一些小技巧,也要学会利用现有的C++标准库(即在OJ中可以直接使用的库,譬如这里的string类),这里说明一下,在C++中string是一个类;

C++中使用string类需要将它include进来:

#include<string>

C中,string.h是对字符串的一系列操作(譬如strlen函数等等),并不是一个类(C中也没有类的概念),要使用这些个函数也要将它include进来:

#include<string.h>

C++大多数情况下是兼容C的,所以C中的string.h在C++中就变成了cstring,在C++中要使用strlen等这些个函数需要将它include进来(当然你#include<string.h>也是可以的):

#include<cstring>

 

路漫漫其修远兮,吾将上下而求索。

相关文章:

  • 2022-12-23
  • 2021-09-29
  • 2021-04-13
  • 2021-10-16
  • 2021-12-10
  • 2021-12-01
猜你喜欢
  • 2021-12-04
  • 2021-12-14
  • 2021-10-22
  • 2021-12-14
  • 2021-11-13
  • 2021-10-01
相关资源
相似解决方案