基础练习 十六进制转八进制
问题描述
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
源代码如下:
#include<stdio.h>
#include<string.h>
char s[1000000];
int a[4000000];
int b[3000000];
int main()
{
int n,i,j,count,k,flag,t;
scanf("%d",&n);
while(n--)//多组测试数据
{
t=1;
flag=0;
k=0;
j=0;
scanf("%s",s);//将要转化的十六进制用字符型存起来。。。。
int len=strlen(s);
for(i=0;i<len;i++)
{
if(s[i]>='0'&&s[i]<='9')//将字符型转化为数字型。。。。。
{
s[i]=s[i]-'0';
}
if(s[i]>='A'&&s[i]<='F')
{
s[i]=s[i]-'A'+10;
}
flag=flag+4;
j=flag;
while(s[i])//先将十六进制转化为二进制,每一位十六进制转化为四位二进制,转换的重点在于如:39 二进制表示为0011 1100 将这个二进制存入数组中必须按照顺序存。j=0,a[j++]=s[i]%2;那么就变为1100 1001,所以存的时候一次存四位并且四位要倒着存。
{
j--;
a[j]=s[i]%2;
count++;
s[i]=s[i]/2;
}
while(count<4)//另一个难点是如果有的16进制不够四位,那么你要进行补零,如3 二进制为11 你要在前面两位补零凑够4位。
{
j--;
a[j]=0;
count++;
}
count=0;
}
for(i=flag-1;i>=0;i=i-3)
{
if(i-2>=0)
{
b[k]=a[i]+a[i-1]*2+a[i-2]*4;//将二进制转为8进制。。
k++;
}
else
{
while(i>-1)
{
b[k]=b[k]+a[i]*t;
i--;
t=t*2;
}
}
}
if(b[k]!=0)//判断8进制第一位是否为0,如果为0不输出。。
{
printf("%d",b[k]);
}
for(i=k-1;i>=0;i--)
{
printf("%d",b[i]);
}
printf("\n");
}
return 0;
}