这题对我来说是有点难度的,最后做出来,但是提交显示 运行错误,看不出哪里出错了.
我的思路:
将十六进制转化为二进制,二进制最后转化为八进制.
首先将十六进制存入数组,然后将数组中每一位转化为对应的十进制数,之后将再将每一位十进制数转化为二进制数,将这些二进制数以每三位为一组,最后转化为八进制数
.转化成十进制时需要一个数组来存储十进制数,十进制转化为二进制时需要一个数组来存储二进制数.
我编写的程序借鉴了两篇文章,是在这两篇文章的基础上,结合了一下:
蓝桥杯C语言基础练习 十六进制转八进制_zhangge138的博客-CSDN博客_十六进制转八进制蓝桥杯https://blog.csdn.net/zhangge138/article/details/79297234
c语言二进制转换八进制_我是超人,但我不会飞的博客-CSDN博客_c语言二进制转八进制二进制转换为八进制把要转换的二进制数按照3位一组从右边往左边分组。不足3位的在左边补上0111001111001=001 110 001 111 001#include<stdio.h>#define MAX 1024 /*****************往左补0 n需要补0的个数*******************/int * Move(int *Elem,...https://blog.csdn.net/qq_39771637/article/details/85390565我写的程序:.
#include<stdio.h>
#include<string.h>
#define N 100002
#define M 400002int eighteenTrans(char ch)
{if(ch >= '0' && ch <= '9')ch -= 48;if(ch >= 'A' && ch <= 'F')ch -= 55;return ch;
} //二进制转八进制
void binary_2_Octal(int B[],int len) {int i,num;int j = 0;int sum[N];for(i=0;i<len;i+=3){sum[j] = B[i]*4 + B[i+1]*2 + B[i+2];j++;}num=0;for(i=0;i<j;i++) //判断是否八进制数全为0 num += sum[i]; if(!num){printf("%d",num);}else{i=0;while(!sum[i]) //去掉前导0 i++;for(i;i<j;i++) printf("%d",sum[i]);}
}int B[M];
int B1[M];
char H[N];
int main()
{ int n,length,i,j,len,k;scanf("%d",&n);if(n<1||n>10)return 0;while(n){scanf("%s",H); //从高位到低位存入,H[0]是高位 if(H[0] == '0' || H[0] == '-') { //保证输入是正整数,并且没有前导0 continue;}else{n--;//ruirui add}len = 0;k = 0;length = strlen(H);j=length-1;for(j;j>=0;j--) {//将十六进制的每一位转换为十进制int num = eighteenTrans(H[j]); //再转换为每三位为一组的二进制数 int count = 3;for(count;count >= 0;count--) {//只能从低位向高位存储,并且可以记录他的长度 B[len] = num%2; num /= 2;len++;} }for(i=len-1;i>=0;i--) //将数组逆向存入B1[k]{B1[k]=B[i];k++;} /*-------------------补0-----------------------*/ if(k%3==0){binary_2_Octal(B1,k);}if(k%3==1){for(i=k+1;i>=2;i--){B1[i]=B1[i-2];}k += 2; for(i=0;i<2;i++)B1[i] = 0; binary_2_Octal(B1,k);}if(k%3==2){for(i=k;i>=1;i--)B1[i]=B1[i-1];k += 1;B1[0] = 0; binary_2_Octal(B1,k);}printf("\n"); }return 0;
}
提交到蓝桥杯,显示运行错误,用蓝桥杯给的输入文件测试了一遍都对着呢,始终不知道是哪里出错了
大神在我的基础上,优化了一下:
#include<stdio.h>
#include<string.h>
#define N 100000// 十六进制转十进制
int eighteen2Ten(char ch)
{if(ch >= '0' && ch <= '9')ch -= 48;if(ch >= 'A' && ch <= 'F')ch -= 55;return ch;
} //二进制转八进制
int two2Eight(int B[], int len)
{return B[0]*4 + B[1]*2 + B[2];
}char arr16[N];
int arr2[N];
int _arr2[N];int main()
{ int n, i, j;scanf("%d",&n);if(n<1||n>10) //或的关系 return 0;while(n) {scanf("%s", arr16); //从高位到低位存入,arr16[0]是高位 // 防止输入0开头或负数 if(arr16[0] == '0' || arr16[0] == '-') {continue;}else{n--;}int len_2 = 0;for(j = strlen(arr16) - 1; j >= 0; j--) {int num = eighteen2Ten(arr16[j]);//16->10int count = 3;for(count; count >= 0; count--)//10->2{arr2[len_2] = num % 2;//只能从低位向高位存储,并且可以记录他的长度 num /= 2;len_2++;} }
// for(i = 0; i < len_2; i++)
// printf("arr2[%d] = %d\n", i, arr2[i]);
// for(i = len_2 - 1; i >= 0; i--)
// printf("arr2[%d] = %d\n", i, arr2[i]);
// printf("len_2 = %d\n", len_2);for(i = 0; i< len_2; i++)//把数组逆序存储 {_arr2[len_2 - i - 1] = arr2[i];
// printf("_arr2[%d] = %d\n", i, _arr2[i]);} //2->8int len_mod = len_2 % 3;int k = 0;// 余1补2位 余2补1位 if(len_mod == 1){k = -2;} else if(len_mod == 2){k = -1;}int tmp = 0;for(i = k; i <len_2; i += 3){int n0 = i < 0 ? 0 : _arr2[i];int n1 = i+1 < 0 ? 0 : _arr2[i+1];int n2 = _arr2[i+2];int n[3] = {n0, n1, n2};
// printf("i = %d, 取出3位二进制为: %d, %d, %d\n", i, n0, n1, n2);int x = two2Eight(n, 3);if(x == 0){ //去掉前导0 if(tmp == 0){tmp = 1;}else{printf("%d", x);}}else{printf("%d", x);} }printf("\n");}return 0;
}
提交到蓝桥杯,显示运行超时,猜测有可能是 函数two2Eight 的问题。
已经在这道题上花了太多时间,以后有时间再继续研究。