【藍橋杯】十六進制轉八進制

題目

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

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

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

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

樣例輸入
  2
  39
  123ABCci

樣例輸出
  71
  4435274字符串

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

程序

#include<iostream> 
#include<string>
using namespace std;
int main()
{
       //freopen("data.txt","r",stdin);        //此句用來測試  
    string six,oct[10],bin;   //six存儲每個輸入的十六進制,oct存儲總的轉換後的八進制,bin存儲每個中間二進制 
    int n;
    cin>>n;
    int binlen=bin.size();
    int flagbin=0;
    for(int i=0;i<n;i++)
    {
        cin>>six;
        bin.erase(0,binlen);          //每一輪使用bin存儲二進制前先將其初始化
        for(int j=0;j<six.size();j++)
        {
            switch(six[j]){                          //十六進制轉二進制,比較直白粗暴的方法
                case '0':bin+="0000";break;
                case '1':bin+="0001";break;
                case '2':bin+="0010";break;
                case '3':bin+="0011";break;
                case '4':bin+="0100";break;
                case '5':bin+="0101";break;
                case '6':bin+="0110";break;
                case '7':bin+="0111";break;
                case '8':bin+="1000";break;
                case '9':bin+="1001";break;
                case 'A':bin+="1010";break;
                case 'B':bin+="1011";break;
                case 'C':bin+="1100";break;
                case 'D':bin+="1101";break;
                case 'E':bin+="1110";break;
                case 'F':bin+="1111";break;
            }
        }
        binlen=bin.size();
        flagbin=0;
        int flagoct=0;
        int lenth=0;
        while(bin[flagbin]=='0')           //去除二進制前綴0
        {
            flagbin++;
            binlen--;
           }
           if(flagbin!=0)
            bin.erase(0,flagbin);
        if(binlen%3==1)           //向3的倍數補齊,便於八進制轉換
        {
            bin="00"+bin;
        }
        else if(binlen%3==2)
        {
            bin="0"+bin;
        }
        binlen=bin.size();
        for(flagbin=0;flagbin<binlen;)         //將二進制轉換爲八進制
        {
            int tempnum; 
            tempnum=(bin[flagbin++]-'0')*4+(bin[flagbin++]-'0')*2+(bin[flagbin++]-'0');
            switch(tempnum){                //同暴力轉換
                case 0:oct[i]+='0' ;break;
                case 1:oct[i]+='1' ;break;
                case 2:oct[i]+='2' ;break;
                case 3:oct[i]+='3' ;break;
                case 4:oct[i]+='4' ;break;
                case 5:oct[i]+='5' ;break;
                case 6:oct[i]+='6' ;break;
                case 7:oct[i]+='7' ;break;
            }
        }
        
    }
    for(int p=0;p<n;p++)
    {
        cout<<oct[p]<<endl; 
    }
    return 0;
}

編寫程序中出現過的錯誤

1.八進制轉換二進制時,忘了減‘0’
減‘0’是爲了將字符形式的數字轉化爲int型進行計算,計算出tempnum後再使用switch句型轉化爲字符形式的八進制。
2.bin使用後忘記清空字符串
即每輪輸入使用bin存儲二進制後再次使用時忘記清除,在每輪開始前進行初始化便可it

相關文章
相關標籤/搜索