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

蓝桥杯基础练习 十六进制转八进制在这里插入图片描述

需要注意的是数长度,以及如何转换(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(j
4%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(t
0&&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换成一维试试看。降低复杂度

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值