做不秃头的程序员 2018-11-14 04:55 采纳率: 0%
浏览 1089

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

问题描述
  给定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>
#include<stdlib.h>
#define MAX 7
typedef struct      /结构体定义
{
    char *base;
    int front;
    int rear;
    int k;
}Sq ;
void push (Sq &S , char x)   //入队
{
    if((S.rear+1)%MAX==S.front) exit;
    S.base[S.rear]=x;
    S.rear=(S.rear+1)%MAX;
    S.k++;
};

char pop (Sq &S)   //出队
{
    if(S.rear==S.front) exit;
    char x;
    x=S.base[S.front];
    S.front=(S.front+1)%MAX;
    S.k--;
    return x;
}

int main() 
{
    int n;
    scanf("%d",&n);
    char a[n][1000100];
    int i;
    for(i=0;i<n;i++)
    {
        scanf("%s",a[i]);
        Sq Q;
        Q.base=new char[MAX];    //初始化循环队列
        Q.front=0;Q.rear=0;
        Q.k=0;
        int k=strlen(a[i]);
        if(k*4%3==1) {push(Q,'0');push(Q,'0');}    //补0
        if(k*4%3==2) {push(Q,'0');}
        int q=0;
        while(q<k)     //入队,出队,输出操作
        {
            switch(a[i][q])     //每个十六进制转化为二进制入队
            {
                case '1' :push(Q,'0');push(Q,'0');push(Q,'0');push(Q,'1');break;
                case '2' :push(Q,'0');push(Q,'0');push(Q,'1');push(Q,'0');break;
                case '3' :push(Q,'0');push(Q,'0');push(Q,'1');push(Q,'1');break;
                case '4' :push(Q,'0');push(Q,'1');push(Q,'0');push(Q,'0');break;
                case '5' :push(Q,'0');push(Q,'1');push(Q,'0');push(Q,'1');break;
                case '6' :push(Q,'0');push(Q,'1');push(Q,'1');push(Q,'0');break;
                case '7' :push(Q,'0');push(Q,'1');push(Q,'1');push(Q,'1');break;
                case '8' :push(Q,'1');push(Q,'0');push(Q,'0');push(Q,'0');break;
                case '9' :push(Q,'1');push(Q,'0');push(Q,'0');push(Q,'1');break;
                case 'A' :push(Q,'1');push(Q,'0');push(Q,'1');push(Q,'0');break;
                case 'B' :push(Q,'1');push(Q,'0');push(Q,'1');push(Q,'1');break;
                case 'C' :push(Q,'1');push(Q,'1');push(Q,'0');push(Q,'0');break;
                case 'D' :push(Q,'1');push(Q,'1');push(Q,'0');push(Q,'1');break;
                case 'E' :push(Q,'1');push(Q,'1');push(Q,'1');push(Q,'0');break;
                case 'F' :push(Q,'1');push(Q,'1');push(Q,'1');push(Q,'1');break;
            }
            while(Q.k>=3)    //当循环队列有元素超过3个,进行出队
            {
                char b,w,m;
                b=pop(Q);
                w=pop(Q);
                m=pop(Q);
                int a[1];
                a[0]=(b-'0')*4+(w-'0')*2+(m-'0');     //转化为八进制
                if(q==0&&a[0]==0) continue;     
                        else printf("%d",a[0]);       //输出

            }
        q++;
        }
        printf("\n");
    }
    return 0;
}

  • 写回答

1条回答 默认 最新

  • dabocaiqq 2018-11-14 11:00
    关注
    评论

报告相同问题?

问题事件

  • 请选择合适的标签 10月20日

悬赏问题

  • ¥15 树莓派与pix飞控通信
  • ¥15 自动转发微信群信息到另外一个微信群
  • ¥15 outlook无法配置成功
  • ¥30 这是哪个作者做的宝宝起名网站
  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题