题目来源:蓝桥杯基础练习
知识点:进制转换,字符输入
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0 ~ 9、大写字母A ~ F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。
题目分析
题目比较直接,通过以二进制为桥梁,将十六进制转为二进制,再将二进制转为八进制即可。一位十六进制数对应四位二进制数,三位二进制数对应一位八进制数。十六进制转出来的二进制数的长度不一定是 3 的倍数,可以在前面添 0 解决。
问题
在编写程序时,我使用的是 string,因此我顺便整理了一下C++中常见的几种字符输入的方法以及它们的特点。
cin
- 输入数字
- 输入字符串,遇到“空格”、“Tab”、“回车”结束,结束符不会包含在字符串内。
// 1.
char str[100];
cin >> str;
// 2.
string str;
cin >> str;
输入:abcabc abc
输出:abcabc
cin.get()
- 接收一个字符,遇到“回车”结束。
char ch;
ch = cin.get();
- 接收一行字符(串),可以接收空格。自动给字符串末尾添加终止符
'\0'
,因此实际上输入的长度是第二个参数 -1。
char a[20];
cin.get(a, 20);
- 舍弃无用字符,如吃掉回车。
char a[20];
char b[10];
cin.get(a, 20);
cin.get(); // 若没有这行,下面的一行遇到回车直接结束
cin.get(b, 10);
cin.getline()
- 接收一个字符串,可以接收空格,同样会自动在末尾添加
'\0'
,遇到“回车”结束。
char a[20];
cin.getline(a, 20);
cin.getline()
实际上有三个参数,为cin.getline(接收字符串,接收长度,结束字符)
。结束字符默认为'\0'
,若写上第三个参数,字符串末尾的字符就是设定的结束符。
getline()
- 接收一个字符串,可以接收空格,遇到“回车结束”。
string str;
getline(cin, str);
cin.getline()
是istream
流,getline()
是string
流。
gets()
- 接收一个字符串,可以接收空格,遇到“回车”结束。
char a[20];
gets(a);
cin.getline()
和gets()
可以用于多维数组。
char m[3][20];
for(int i=0; i<3; i++) {
cin.getline(m[i],20);
// gets(m[i]);
}
cin.ignore()
- 忽略一个输入的字符,也可以用来舍弃无用字符,与
cin.get()
类似。
cin.ignore();
代码
#include <bits/stdc++.h>
using namespace std;
void f_16to2(string& str16, string& str2) {
for(int i=0; i<str16.length(); i++) {
if(str16[i] == '0') {
str2 += "0000";
}
else if(str16[i] == '1') {
str2 += "0001";
}
else if(str16[i] == '2') {
str2 += "0010";
}
else if(str16[i] == '3') {
str2 += "0011";
}
else if(str16[i] == '4') {
str2 += "0100";
}
else if(str16[i] == '5') {
str2 += "0101";
}
else if(str16[i] == '6') {
str2 += "0110";
}
else if(str16[i] == '7') {
str2 += "0111";
}
else if(str16[i] == '8') {
str2 += "1000";
}
else if(str16[i] == '9') {
str2 += "1001";
}
else if(str16[i] == 'A') {
str2 += "1010";
}
else if(str16[i] == 'B') {
str2 += "1011";
}
else if(str16[i] == 'C') {
str2 += "1100";
}
else if(str16[i] == 'D') {
str2 += "1101";
}
else if(str16[i] == 'E') {
str2 += "1110";
}
else if(str16[i] == 'F') {
str2 += "1111";
}
}
}
void f_2to8(string& str2, string& str8) {
int m = 0;
if(str2.length() % 3 != 0) {
for(m=1; ; m++) {
if((str2.length() + m) % 3 == 0) break;
}
}
string str0 = "";
for(int i=0; i<m; i++) {
str0 += "0";
}
if(m) str2 = str0 + str2;
for(int i=0; i<str2.length(); i+=3) {
string str = str2.substr(i, 3);
if(str.compare(string("000")) == 0) str8 += "0";
else if(str.compare(string("001")) == 0) str8 += "1";
else if(str.compare(string("010")) == 0) str8 += "2";
else if(str.compare(string("011")) == 0) str8 += "3";
else if(str.compare(string("100")) == 0) str8 += "4";
else if(str.compare(string("101")) == 0) str8 += "5";
else if(str.compare(string("110")) == 0) str8 += "6";
else if(str.compare(string("111")) == 0) str8 += "7";
}
int p = -1;
for(int i=0; i<str8.length(); i++) {
if(str8[i] != '0') break;
else p = i;
}
if(p != -1) str8 = str8.substr(p + 1, str8.length() - p - 1);
}
int main() {
int n;
cin >> n;
while(n--) {
string str16 = "";
cin >> str16;
string str2 = "";
f_16to2(str16, str2);
string str8 = "";
f_2to8(str2, str8);
cout << str8 << endl;
}
return 0;
}