这个题目实现起来不是很难,因为一位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>
路漫漫其修远兮,吾将上下而求索。