您的位置:首页 > 其它

蓝桥杯基础训练 十六进制转八进制

2015-11-24 16:17 204 查看
基础练习 十六进制转八进制
问题描述

  给定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;

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: