//16进制转8进制
//思路:16进制转成2进制串,2进制串从后每3位转成8进制串
#include <stdio.h>
#include <string.h>
#define maxN 10
#define maxLength 100000
int main()
{
int i,j,k,m,n,len,temp,sum;
char a[maxN][maxLength];
char *bi;//转换成2进制所存储的数组
char *tri;//转成3进制所存的数组
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%s",a[i]);
for(i=0;i<n;i++)
{
//确定2进制数组和3进制数组的长度
k=4*strlen(a[i]);
bi=new char[k];
if(k%3==0)
{
len=k/3;
tri=new char[len];
}
else
{
len=k/3+1;
tri=new char[len];
}
k=0;
//将16进制转成2进制
for(j=0;j<strlen(a[i]);j++)
{
//得到16进制字符所对应数字大小
if('0'<=a[i][j] && a[i][j]<='9')
temp=a[i][j]-'0';
else
temp=a[i][j]-'A'+10;
//4位制法,将每个16进制字符转成4位2进制字符
if(temp>=8)
{ bi[k++]='1';temp-=8; }
else
bi[k++]='0';
if(temp>=4)
{ bi[k++]='1';temp-=4; }
else
bi[k++]='0';
if(temp>=2)
{ bi[k++]='1';temp-=2; }
else
bi[k++]='0';
if(temp>=1)
{ bi[k++]='1';temp-=1; }
else
bi[k++]='0';
}
//输出2进制字符串
//m=0;
//for(m=0;m<4*strlen(a[i]);m++)
//{
// if(bi[m]=='2')
// break;
// printf("%c",bi[m]);
//}
//将2进制字符串从后开始,每3位转成8进制
k=k-1;j=1;sum=0;m=k;temp=len;
while(m>=0)
{
if(j==1 && m>=0)
{ sum+=(bi[m--]=='1'?1:0);j++;}
if(j==2 && m>=0)
{ sum+=(bi[m--]=='1'?2:0);j++;}
if(j==3 && m>=0)
{
sum+=(bi[m--]=='1'?4:0);
if(len>=0)
tri[--temp]=sum+'0';
}
j=1;sum=0;
}
//8进制字符串输出
j=0;
for(m=0;m<len;m++)
{
if(tri[m]!='0')
j=1;
if(j==1)
printf("%c",tri[m]);
}
printf("\n");
}
return 0;
}
16进制转8进制
最新推荐文章于 2022-02-23 22:29:32 发布