C语言为入门级别,有很多不足,希望各位大神指导
代码目标:
给定n个十六进制正整数,输出它们对应的八进制数。
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
输入格式
输入的第一行为一个正整数n (1<=n<=10)。
接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。
输出格式
输出n行,每行为输入对应的八进制正整数。
【注意】
输入的十六进制数不会有前导0,比如012A。
输出的八进制数也不能有前导0。
样例输入
2
39
123ABC
样例输出
71
4435274
代码如下
#include <stdio.h>
#include <malloc.h>
void Get16_2(char c,int r[]){
switch(c){
case '0':r[0]=0;r[1]=0;r[2]=0;r[3]=0;break;
case '1':r[0]=0;r[1]=0;r[2]=0;r[3]=1;break;
case '2':r[0]=0;r[1]=0;r[2]=1;r[3]=0;break;
case '3':r[0]=0;r[1]=0;r[2]=1;r[3]=1;break;
case '4':r[0]=0;r[1]=1;r[2]=0;r[3]=0;break;
case '5':r[0]=0;r[1]=1;r[2]=0;r[3]=1;break;
case '6':r[0]=0;r[1]=1;r[2]=1;r[3]=0;break;
case '7':r[0]=0;r[1]=1;r[2]=1;r[3]=1;break;
case '8':r[0]=1;r[1]=0;r[2]=0;r[3]=0;break;
case '9':r[0]=1;r[1]=0;r[2]=0;r[3]=1;break;
case 'A':r[0]=1;r[1]=0;r[2]=1;r[3]=0;break;
case 'B':r[0]=1;r[1]=0;r[2]=1;r[3]=1;break;
case 'C':r[0]=1;r[1]=1;r[2]=0;r[3]=0;break;
case 'D':r[0]=1;r[1]=1;r[2]=0;r[3]=1;break;
case 'E':r[0]=1;r[1]=1;r[2]=1;r[3]=0;break;
case 'F':r[0]=1;r[1]=1;r[2]=1;r[3]=1;break;
}
}
int Csize(char *c){ //输入的16进制字符串长度
int i=0;
for(;c[i]!='\0';i++);
return i;
}
void Put2_8(int *array,int s,int n,int l){
int t;
for(int i=s;i<n-2;){
t = array[i]*4 + array[i+1]*2 + array[i+2];
if(l == 0){
if(t != 0)
printf("%d",t);
}
else
{
printf("%d",t);
l = 1;
}
i+=3;
}
printf("\n");
}
void Cheak2(int *array,int n){ //检查二进制数位数是否是3的整数倍
int l=0,y = n%3; //y 2进制数位数对三取余 l 八进制数首位是否为0
if(y == 1)
{
if(array[0] == 1){
printf("%d",1);
l=1;
}
}
if(y == 2){
l = array[0]*2 + array[1];
if(l != 0)
printf("%d",l);
}
Put2_8(array,y,n,l); //调用转化输出函数
}
void fun(char *c16){
int r16[4],array[21],tk;
tk = Csize(c16);
for(int i=0;i<tk;i++)
{
Get16_2(c16[i],r16);
for(int j=0;j<4;j++){
array[i*4+j] = r16[j];
}
}
Cheak2(array,tk*4);
}
int main() {
int N;
char c16[10][10];
scanf("%d",&N);
for(int i=0;i<N;i++)
scanf("%s",c16[i]);
for(int i=0;i<N;i++)
fun(c16[i]);
return 0;
}