蓝桥杯基础练习 十六进制转八进制

16转8进制


这几天大概弄了一下蓝桥杯的题目,有难度是正常的,我记得我那个16转8进制的题目提交了20多次才正确通过,主要是考虑问题不周到和类型转换函数不是彻底明白,平时都用的好好的函数在数据量极大的情况下总是有一些意料之外的错误,而且那些错误有非常难找出来,真的是浪费了大把时间。下面是我这今天记录下来的一些笔记

这是蓝桥杯基础练习 十六进制转八进制

问题描述:
  给定n个十六进制正整数,输出它们对应的八进制数。
  
输入格式:
  输入的第一行为一个正整数n (1<=n<=10)。
  接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
  
输出格式
  输出n行,每行为输入对应的八进制正整数。
  
  【注意】
  输入的十六进制数不会有前导0,比如012A。
  输出的八进制数也不能有前导0。
样例输入
  2
  39
  123ABC
样例输出
  71
  4435274
  
  【提示】
  先将十六进制数转换成某进制数,再由某进制数转换成八进制。

这是最初想用vector来解决,但是放到蓝桥杯的编译系统里面后好多错误,不可行,而且在数据量很多的情况下需要时间需要很长。

#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;
}

下面这个是改进之后在蓝桥杯编译系统里面完成

#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;
}
posted @ 2018-05-06 15:44  NeverTh  阅读(369)  评论(0编辑  收藏  举报