给定n个十六进制正整数,输出他们对应的八进制数。(注: 编写函数,先将十六进制转化为二进制,再转化为八进制,最后输出)
输入格式:
输入的第一-行为一个正整数n (1<=n<=10) 。接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式:
输出n行,每行为对应的八进制正整数。
注意:
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0.
样例输入:
2
39
123ABC
样例输出:
71
4435274
最开始没有仔细读题,思路很常规,就是16进制先转化为10进制,然后10进制数转化为8进制数。代码如下:
#include<stdio.h>
#include<string.h>
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
char a[100005];
scanf("%s",a);
int l,i,k,ans[200005],t;
long long int c=0;
l=strlen(a);
for(i=0;i<l;i++)
{
if(a[i]>='0'&&a[i]<='9')
c=c*16+a[i]-48;
else
c=c*16+a[i]-55;
}
// printf("%lld",c);
t=0;
while(c!=0)
{
k=c%8;
ans[t]=k;
c/=8;
t++;
}
for(i=t-1;i>=0;i--)
printf("%d",ans[i]);
printf("\n");
}
return 0;
}
但是后来发现题意是16进制直接转2进制,然后2进制转8进制。
思路是16进制的每一个数是2进制的连续4个数组成,然后3个连续的2进制数是一个8进制数。
由此,代码如下:
#include<stdio.h>
#include<string.h>
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
char a[100005];
int b[400005];
scanf("%s",a);
int l,i,k,t,d,j=0,s=0;
l=strlen(a);
memset(b,0,sizeof b);
int h,m;
for(i=l-1;i>=0;i--)
{
h=0;
if(a[i]>='0'&&a[i]<='9')
k=a[i]-48;
else
k=a[i]-55;
while(k!=0)
{
t=k%2;
b[4*s+h]=t;
k/=2;
h++;
}
s++;
}
m=4*(s-1)+h;
//16进制转2进制
/* for(i=m-1;i>=0;i--)
printf("%d",b[i]);
printf("\n");
*/
if(m%3==0)
d=m+2;
else if(m%3==1)
d=m+1;
else
d=m-1;
for(i=d;i>=2;i-=3)
{
j=b[i-2]+2*b[i-1]+4*b[i];
if(i==d&&j==0)continue;
printf("%d",j);
}
//2进制转8进制
printf("\n");
}
return 0;
}