这几天大概弄了一下蓝桥杯的题目,有难度是正常的,我记得我那个16转8进制的题目提交了20屡次才正确经过,主要是考虑问题不周到和类型转换函数不是完全明白,平时都用的好好的函数在数据量极大的状况下老是有一些意料以外的错误,并且那些错误有很是难找出来,真的是浪费了大把时间。下面是我这今天记录下来的一些笔记ios
这是蓝桥杯基础练习 十六进制转八进制 c++
问题描述:
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式:
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~九、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每一个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,好比012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
【提示】
先将十六进制数转换成某进制数,再由某进制数转换成八进制。函数
这是最初想用vector来解决,可是放到蓝桥杯的编译系统里面后好多错误,不可行,并且在数据量不少的状况下须要时间须要很长。spa
#include <iostream> #include <vector> #include <string> #include <sstream> using namespace std; string Swap16To2(char c) { vector<string> table16To2{ "0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111" }; string out; int n; if (c >= '0' && c <= '9'){ n = c - '0'; out = table16To2[n]; } if (c >= 'A' && c <= 'F') { n = c - 'A' + 10; out = table16To2[n]; } return out; } string Swap2To8(string num){ string num8; while (num.size() % 3 != 0) { num.insert(0, "0"); } for (int i = 0; i < num.size(); i += 3) { stringstream stream; stream << ((num[i] - '0') * 2 * 2 + (num[i + 1] - '0') * 2 + (num[i + 2] - '0'));//这种方法不可行,cpu占用高且超时,最好仍是用查找列表 num8 = stream.str(); } return num8; } int main(){ int n; string temp_in = ""; vector<string> num16, num8; cin >> n; vector<string> temp_out2(n); auto temp_out2Begin = temp_out2.begin(); for (int i = 0; i < n; ++i) { cin >> temp_in; num16.push_back(temp_in); } for (auto i = num16.begin(); i < num16.end(); ++i, ++temp_out2Begin) { for (int j = 0; j < (*i).length(); ++j) (*temp_out2Begin) += Swap16To2((*i)[j]); } for (auto i = temp_out2.begin(); i < temp_out2.end(); ++i) { cout << atoi(Swap2To8(*i).c_str()) << endl; } system("pause"); return 0; }
下面这个是改进以后在蓝桥杯编译系统里面完成code
#include <iostream> #include <string> using namespace std; string Swap16To2(char c){//这里是传进来一个字符 string table16To2[] = { "0000", "0001", "0010", "0011", "0100", "0101", "0110", "0111", "1000", "1001", "1010", "1011", "1100", "1101", "1110", "1111" }, out; if (c >= '0' && c <= '9') //开始根据table来返回4个字符的字符串 out = table16To2[c - '0']; if (c >= 'A' && c <= 'F') out = table16To2[c - 'A' + 10]; return out; } string Swap2To8(string num) {//传进来一个2进制字符串 string num8; while (num.size() % 3 != 0) {//补0 num = "0" + num;//在参考朋友的以后发现这个地方居然能够这么简单 } for (int i = 0; i < num.size(); i += 3) { if (num.substr(i, 3) == "000") { if (i == 0)//省去最开始的一个零 continue; num8 += "0"; } else if (num.substr(i, 3) == "001") num8 += "1"; else if (num.substr(i, 3) == "010") num8 += "2"; else if (num.substr(i, 3) == "011") num8 += "3"; else if (num.substr(i, 3) == "100") num8 += "4"; else if (num.substr(i, 3) == "101") num8 += "5"; else if (num.substr(i, 3) == "110") num8 += "6"; else if (num.substr(i, 3) == "111") num8 += "7"; } return num8; } int main() { int n, i, j; string temp_in = ""; string num16[10], num8[10], temp_out2[10]; cin >> n; for (i = 0; i < n; i++) { cin >> temp_in; num16[i] = temp_in; } for (i = 0; i < n; i++) {//转换成二进制 for (j = 0; j < num16[i].size(); j++) temp_out2[i] += Swap16To2(num16[i][j]); } for (i = 0; i < n; i++) {//转换成16进制 cout << Swap2To8(temp_out2[i]) << endl; } system("pause"); return 0; }