资源限制
时间限制: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愿意帮我看看错在哪就最好了…………
蓝桥杯恐怖如斯。