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