剛開始想的是先把十六進制轉化為十進制,然後十進制再轉化為八進制,但是發現當資料量太大的時候,計算量太大,可能會逾時,是以這裡改為先轉化為二進制再轉化為八進制。
代碼:
#include<iostream>
#include<string>
using namespace std;
int main( )
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
string a,b,c;
cin>>a;
for(int j=0;j<a.length();j++)
{
switch(a[j])
{
case '0': b+="0000"; break;
case '1': b+="0001"; break;
case '2': b+="0010"; break;
case '3': b+="0011"; break;
case '4': b+="0100"; break;
case '5': b+="0101"; break;
case '6': b+="0110"; break;
case '7': b+="0111"; break;
case '8': b+="1000"; break;
case '9': b+="1001"; break;
case 'A': b+="1010"; break;
case 'B': b+="1011"; break;
case 'C': b+="1100"; break;
case 'D': b+="1101"; break;
case 'E': b+="1110"; break;
case 'F': b+="1111"; break;
default: break;
}
}
int len=b.length();
if(len%3==1)
{
b="00"+b;
len+=2;
}
else if(len%3==2)
{
b="0"+b;
len++;
}
for(int k=0;k<len;k+=3)
{
int ans=(b[k]-'0')*4+(b[k+1]-'0')*2+(b[k+2]-'0');
c+=(ans+'0');
}
int cnt=0;
while(c[cnt]=='0') cnt++;
for(int k=cnt;k<c.length();k++)
cout<<c[k];
cout<<endl;
}
return 0;
}