蓝桥杯基础练习 十六进制转八进制![在这里插入图片描述](https://img-blog.csdnimg.cn/20200703184013990.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2pqMjMyOTk2MDU3Nw==,size_16,color_FFFFFF,t_70)
需要注意的是数长度,以及如何转换(16->10->8? 16->2->8?)
以下是我的代码,100%通过。
#include<stdio.h>
#include<string.h>
int main(){
int i,j,k,n,t,q;
char c[10][200001];
char a[100001],b[400001];
scanf("%d",&n);//至多10个
getchar();//吸收\n
for(i=0;i<n;i++){
k=4;//为后面补位做铺垫,先预留出来用来补零的
gets(a);//取数(输入)
q=0;//输出的数组
for(j=0;a[j]!='\0';j++,k+=4){//转换为2进制数 ,注意此时k从4开始循环,预留出来四位补零
switch(a[j]){
case '0':strcpy(&b[k],"0000");break;
case '1':strcpy(&b[k],"0001");break;
case '2':strcpy(&b[k],"0010");break;
case '3':strcpy(&b[k],"0011");break;
case '4':strcpy(&b[k],"0100");break;
case '5':strcpy(&b[k],"0101");break;
case '6':strcpy(&b[k],"0110");break;
case '7':strcpy(&b[k],"0111");break;
case '8':strcpy(&b[k],"1000");break;
case '9':strcpy(&b[k],"1001");break;
case 'A':strcpy(&b[k],"1010");break;
case 'B':strcpy(&b[k],"1011");break;
case 'C':strcpy(&b[k],"1100");break;
case 'D':strcpy(&b[k],"1101");break;
case 'E':strcpy(&b[k],"1110");break;
case 'F':strcpy(&b[k],"1111");break;
default:break;
}
}
if(j4%3==1){//多出1位,所以补两个零,记录起始下标
b[3]=‘0’;
b[2]=‘0’;
j=2;//补位,使二进数能被3整除
}
else if(j4%32) {//多出2位,所以补一个零,记录起始下标
b[3]=‘0’;
j=3;
}
else j=4;//整除,记录起始下标
for(;j<k;j+=3){
t=(b[j]-‘0’)*4+(b[j+1]-‘0’)*2+(b[j+2]-‘0’)*1;
if(t0&&j2||t0&&j3||t0&&j==4);//第一位是0的话不用输出
else {
c[i][q]=t+‘0’;
q++;
}
}
}//至此大循环输入、处理结束
for(i=0;i<n;i++) {
puts(c[i]);
}
return 0;
}
改进的话,把二维数组c换成一维试试看。降低复杂度