題目
問題描述
給定n個十六進制正整數,輸出它們對應的八進制數,
輸入格式
輸入的第一行為一個正整數n (1<=n<=10),
接下來n行,每行一個由09、大寫字母AF組成的字串,表示要轉換的十六進制正整數,每個十六進制數長度不超過100000,
輸出格式
輸出n行,每行為輸入對應的八進制正整數,
【注意】
輸入的十六進制數不會有前導0,比如012A,
輸出的八進制數也不能有前導0,
樣例輸入
2
39
123ABC
樣例輸出
71
4435274
【提示】
先將十六進制數轉換成某進制數,再由某進制數轉換成八進制,
程式
#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存盤二進制后再次使用時忘記清除,在每輪開始前進行初始化即可
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/61733.html
標籤:C++
上一篇:Max Sum
