藍橋杯基礎練習 十六進制轉八進制

16轉8進制


這幾天大概弄了一下藍橋杯的題目,有難度是正常的,我記得我那個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;
}
相關文章
相關標籤/搜索