十六進制轉八進制(藍橋杯)


問題描述
  給定n個十六進制正整數,輸出它們對應的八進制數。

輸入格式
  輸入的第一行為一個正整數n (1<=n<=10)。
  接下來n行,每行一個由0~9、大寫字母A~F組成的字符串,表示要轉換的十六進制正整數,每個十六進制數長度不超過100000。

輸出格式
  輸出n行,每行為輸入對應的八進制正整數。

   【注意
  輸入的十六進制數不會有前導0,比如012A。
  輸出的八進制數也不能有前導0。

樣例輸入
  2
  39
  123ABC

樣例輸出
  71
  4435274

   提示
  先將十六進制數轉換成某進制數,再由某進制數轉換成八進制。

下面是我的代碼解決思路:

#include <iostream>
#include <string>
#include <vector>
using namespace std;
/*
算法解釋:
        采用字符串方式接收待轉換的十六進制數。用對應函數將其轉換為二進制數,存在字符串中,再用數學方法將其對應的二進制轉換為八進制值,結果存為vector<int>類型並打印。
遇到問題的解決方法:
        1. 十六進制轉二進制,1個十六進制位對應4個二進制位,但3個二進制位,對應1個八進制位。可能出現二進制轉為八進制時,位數不正確導致錯誤。如A12為1010 0001
        轉為八進制時: 10 100 001 ,前面只有兩個二進制數10,不能與八進制相匹配。
         - solution: 判斷存儲二進制的vector長度,flag = 3 - Bin.length()%3; flag即為二進制vector應該在前面添加0的個數 
        2. 題目要求八進制首位不能輸出0,如39轉換結果為071。
         - solution: 返回算法,考慮解決該問題的過程中,發現在輸出時控制是較為簡單的方法,即在輸出時檢測八進制首位是否為0,為0則不輸出。
*/
int main()
{
    string HexToBin(string Hex);
    vector<int> BinToOct(string Bin);
    int cnt;
    cin >> cnt;
    string *Hex = new string[cnt];
    for(int i = 0;i < cnt;i++)
    {
        cin >> Hex[i];
    }
    for(int i = 0;i < cnt;i++)
    {
        vector<int>::iterator it;
        vector<int> result = BinToOct(HexToBin(Hex[i]));
        for(it = result.begin();it!=result.end();it++)
        {
            if(it==result.begin() && *it == 0)
                continue;
            cout<<*it;
        }
        if( i != cnt - 1)
            cout<<endl;
    }
    return 0;
}

string HexToBin(string Hex)
{
    string Bin;
    for(int i = 0;i < Hex.length();i++)
    {
        switch(Hex[i])
        {
            case '0' : Bin.append("0000"); break;
            case '1' : Bin.append("0001"); break;
            case '2' : Bin.append("0010"); break;
            case '3' : Bin.append("0011"); break;
            case '4' : Bin.append("0100"); break;
            case '5' : Bin.append("0101"); break;
            case '6' : Bin.append("0110"); break;
            case '7' : Bin.append("0111"); break;
            case '8' : Bin.append("1000"); break;
            case '9' : Bin.append("1001"); break;
            case 'A' : Bin.append("1010"); break;
            case 'B' : Bin.append("1011"); break;
            case 'C' : Bin.append("1100"); break;
            case 'D' : Bin.append("1101"); break;
            case 'E' : Bin.append("1110"); break;
            case 'F' : Bin.append("1111"); break;
        }
    }
    return Bin;
}

vector<int> BinToOct(string Bin)
{
    int flag = 3 - Bin.length()%3; //
    if(1 == flag)
        Bin.insert(0,"0");
    if(2 == flag)
        Bin.insert(0,"00");

    vector<int> Oct;
    int cnt = 0;
    while(cnt != Bin.length())
    {
        int result;
        result = 4*(Bin[cnt++]- '0') + 2*(Bin[cnt++]- '0') + (Bin[cnt++]- '0');
        Oct.push_back(result);
    }
    return Oct;
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM