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

来源:互联网 发布:bqb认证知乎 编辑:程序博客网 时间:2024/06/06 09:12

基础练习 十六进制转八进制  

问题描述
  给定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;
}

0 0
原创粉丝点击