十六进制转八进制(第一道坎……写麻了)

资源限制

时间限制:1.0s   内存限制:512.0MB

问题描述
  给定n个十六进制正整数,输出它们对应的八进制数。

输入格式
  输入的第一行为一个正整数n (1<=n<=10)。
  接下来n行,每行一个由0~9、大写字母A~F组成的字符串,表示要转换的十六进制正整数,每个十六进制数长度不超过100000。

输出格式
  输出n行,每行为输入对应的八进制正整数。

  【注意
  输入的十六进制数不会有前导0,比如012A。
  输出的八进制数也不能有前导0。

样例输入
  2
  39
  123ABC

样例输出
  71
  4435274

  提示
  先将十六进制数转换成某进制数,再由某进制数转换成八进制。

第一次写这道题,觉得……好简单啊……

以下为第一次的源代码:

#include<stdio.h>
int main(void)
{
    int a,b[10],c,d,n;
    scanf("%d",&n);
    for(a=0;a<n;a++)
    {
        scanf("%x",&b[a]);
    }
    for(a=0;a<n;a++)
    {
        printf("%o\n",b[a]);
    }
    
    return 0;
}


提交前devc++过了两遍,觉得没问题。

提交后看着那个零蛋,我陷入了沉思……

测试一个辣么大的数字有冰啊!!!!!!

CSDN搜索一波。

看不大懂……明明这样好像也没啥问题来着……

按照CSDN各位大佬写的代码,稍微理解了下。

是先十六进制转换为二进制,再二进制转换为八进制。

以下是第二次源代码:

#include<stdio.h>
#include<string.h>
int main(void)
{
    int n,d,b=0,m=0,e[1000]={0},q=0;
    char a[100][10002]={0},c;                 //问题在于5的值占用位置和换行符位置 a用二维数组试试  
    scanf("%d",&n);
    getchar();
    for(d=1;d<=n;d++)
    {
        for(;b<10002;)
        {
            c=getchar();
            if(c!='\n')
            {
              switch(c)
              {
                case '0':a[m][b]=0,a[m][b+1]=0,a[m][b+2]=0,a[m][b+3]=0;break;
                case '1':a[m][b]=0,a[m][b+1]=0,a[m][b+2]=0,a[m][b+3]=1;break;
                case '2':a[m][b]=0,a[m][b+1]=0,a[m][b+2]=1,a[m][b+3]=0;break;
                case '3':a[m][b]=0,a[m][b+1]=0,a[m][b+2]=1,a[m][b+3]=1;break;
                case '4':a[m][b]=0,a[m][b+1]=1,a[m][b+2]=0,a[m][b+3]=0;break;
                case '5':a[m][b]=0,a[m][b+1]=1,a[m][b+2]=0,a[m][b+3]=1;break;
                case '6':a[m][b]=0,a[m][b+1]=1,a[m][b+2]=1,a[m][b+3]=0;break;
                case '7':a[m][b]=0,a[m][b+1]=1,a[m][b+2]=1,a[m][b+3]=1;break;
                case '8':a[m][b]=1,a[m][b+1]=0,a[m][b+2]=0,a[m][b+3]=0;break;
                case '9':a[m][b]=1,a[m][b+1]=0,a[m][b+2]=0,a[m][b+3]=1;break;
                case 'A':a[m][b]=1,a[m][b+1]=0,a[m][b+2]=1,a[m][b+3]=0;break;
                case 'B':a[m][b]=1,a[m][b+1]=0,a[m][b+2]=1,a[m][b+3]=1;break;
                case 'C':a[m][b]=1,a[m][b+1]=1,a[m][b+2]=0,a[m][b+3]=0;break;
                case 'D':a[m][b]=1,a[m][b+1]=1,a[m][b+2]=0,a[m][b+3]=1;break;
                case 'E':a[m][b]=1,a[m][b+1]=1,a[m][b+2]=1,a[m][b+3]=0;break;
                case 'F':a[m][b]=1,a[m][b+1]=1,a[m][b+2]=1,a[m][b+3]=1;break;
              }
                e[q]+=4;
                b+=4;
            }
            
          else
            {
                a[m][b]=5;
                m++,q++;
                b=0;
                break;
            }
      }
    }
    int m_=m;                                        //记录填入数字 
    int q_=q;
     
    char A[100][10002]={0};                        //进行加0 
    int b_=10001;                                   //二维数组的计数 
    
    for(q=m=0;q<q_;q++,m++)
    {
        int f=e[q]%3;
        
        if(f==1)
        {
            A[m][b]=A[m][b+1]=0;
            for(b=0;b<=(e[q]+1);b++)
            {
                A[m][b+2]=a[m][b];
            }
        }
        if(f==2)
        {
            A[m][b]=0;
            for(b=0;b<=(e[q]+1);b++)
            {
                A[m][b+1]=a[m][b];
            }
        }
        if(f==0)
        {
            for(b=0;b<=(e[q]+1);b++)
            {
                A[m][b]=a[m][b];
            }
        }
     } 
    
    for(m=0;m<=m_;m++)
    {
        for(b=0;b<=10001;b+=3)
        {
            if(A[m][b]==5)
            {
                printf("\n");
                break;
            }
            
            int result=4*A[m][b]+2*A[m][b+1]+A[m][b+2];
            if(result!=0)
                printf("%d",result);
        }
    }
    return 0;
}

还是零蛋……

这个程序我写了五六个小时,调了五六个小时……

甚至我看了看标准答案和我的答案放进检测输出的结果,没发现哪里不一样。

那我就完全不能理解不能知道错在哪了……

这道题就算了吧,有哪位闲的没事干的hxd愿意帮我看看错在哪就最好了…………

蓝桥杯恐怖如斯。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值