题目如图:
测试结果:
我的代码:
#include
#include
#include
int zhuanhuan(char c) //将十六进制字符转换为数值
{
if(c>='0'&&c<='9')
return c-'0';
else
return c-'A'+10;
}
int main()
{
int n,i,j,k,len,tmp;
char dy;
char *input[10],*output[10],*output2[10];
scanf("%d",&n);
dy=getchar();
for(i=0;i
{
input[i] = (char *)malloc(100000+1); //储存输入的十六进制数
output[i] = (char *)malloc(100000*4+4);//储存二进制数
output2[i] = (char *)malloc(100000*3+3);//储存最终结果八进制数
gets(input[i]);
}
for(i=0;i
{
len=strlen(input[i]);
j=0;
k=len;
while(k--) //将十六进制转换为二进制,1位十六进制数对应4位二进制数
{
tmp=zhuanhuan(input[i][j]);
output[i][j++]=((tmp>>3)&0x1); //bit3
output[i][j++]=((tmp>>2)&0x1); //bit2
output[i][j++]=((tmp>>1)&0x1); //bit1
output[i][j++]=((tmp>>0)&0x1); //bit0
}
//将二进制转换为八进制,3位二进制数对应1位八进制数,从低位开始转
//j为二进制数组下标,每个循环减3
//k为八进制数组下标,每个循环减1
j=len*4-1;
k=j/3;
output2[i][k+1]='\0';
for(;j>=0;j-=3)
{
if(j>=2)
output2[i][k--]=(output[i][j-2]<<2|output[i][j-1]<<1|output[i][j])+'0';
else if(j==1)
output2[i][k--]=(output[i][j-1]<<1|output[i][j])+'0';
else if(j==0)
output2[i][k--]=output[i][j]+'0';
}
k=k+1;
//去除前导的'0'字符(可能会影响判定结果)
while(output2[i][k]=='0')
k++;
//如果整个字符串都是'0',则直接输出结果'0',否则从首位非'0'开始输出
if(output2[i][k]=='\0')
printf("0\n");
else
printf("%s\n",&output2[i]);
}
for(i=0;i
{
free(input[i]);
free(output[i]);
free(output2[i]);
}
getchar();
}
有什么问题啊??