相比于10进制转16进制和16进制转10进制复杂了许多,首先还是用格式控制符试着输入输出了一下,结果确实没问题。可是提交显示答案错误,因为它的测试数据长度会很长的。
#include <stdio.h>
#include <stdlib.h>
int main()
{
int q;
unsigned int n;
scanf("%d",&q);
while(q--)
{
scanf("%x",&n);
printf("%o\n",n);
}
return 0;
}
于是只好换思路,对,先看看锦囊怎么说。
那么就按照这种思路吧,需要注意的是可能需要修正位数。
#include <iostream>
#include <string>
using namespace std;
int arr[10000001];
int main()
{
int n,len,i,j;
string str,str2;
cin>>n;
while(n--)
{
cin>>str;
len=str.length();
str2="";
// 十六进制转换为二进制
for(i=0; i<len; ++i)
{
switch(str[i])
{
case '0':
str2+="0000";
break;
case '1':
str2+="0001";
break;
case '2':
str2+="0010";
break;
case '3':
str2+="0011";
break;
case '4':
str2+="0100";
break;
case '5':
str2+="0101";
break;
case '6':
str2+="0110";
break;
case '7':
str2+="0111";
break;
case '8':
str2+="1000";
break;
case '9':
str2+="1001";
break;
case 'A':
str2+="1010";
break;
case 'B':
str2+="1011";
break;
case 'C':
str2+="1100";
break;
case 'D':
str2+="1101";
break;
case 'E':
str2+="1110";
break;
case 'F':
str2+="1111";
break;
default:
break;
}
}
// 修正位数
if(len%3==1)
str2="00"+str2;
else if(len%3==2)
str2="0"+str2;
len=str2.length();
// 二进制转换八进制
j=0;
for(i=0; i<=len-2; i+=3)
{
arr[j]=(str2[i]-'0')*4+(str2[i+1]-'0')*2+(str2[i+2]-'0');
++j;
}
for(i=0; i<j; ++i)
{
if(i==0 && arr[i]==0)
continue;
cout<<arr[i];
}
cout<<endl;
}
return 0;
}
运行结果: