蓝桥杯基础练习题5(简陋16进制转10进制)
/* 问题描述 从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。 注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。 样例输入 FFFF 样例输出 65535 */ #include<stdio.h> #include<string.h> #include <stdlib.h> #include <math.h> int main(void){ // printf("hello world!"); int NUM_HEX = 1; //16进制数个数 int DEC = 0; //10进制数个数 int tag; //循环标志 int num_tag; //int BIN_TAG=0; //整体二进制码输入标志 int bin_tag=0; //单个二进制码输入标志 int tempInt; //临时变量 char Hex[20]; //定义一个长度为20的数组,为之后的操作做准备 char Oct[80]; //16进制数二进制码的长度/4*3就是8进制数二进制码的长度 char Bin0[90]; char Bin1[90]; char Bin2[90]; char Bin3[90]; char Bin4[90]; char Bin5[90]; char Bin6[90]; char Bin7[90]; char Bin8[90]; char Bin9[90]; memset( Bin0, '\0', sizeof(Bin0) ); memset( Bin1, '\0', sizeof(Bin1) ); memset( Bin2, '\0', sizeof(Bin2) ); memset( Bin3, '\0', sizeof(Bin3) ); memset( Bin4, '\0', sizeof(Bin4) ); memset( Bin5, '\0', sizeof(Bin5) ); memset( Bin6, '\0', sizeof(Bin6) ); memset( Bin7, '\0', sizeof(Bin7) ); memset( Bin8, '\0', sizeof(Bin8) ); memset( Bin9, '\0', sizeof(Bin9) ); char *BIN_CODE; //根据BIN_TAG确定使用哪一组二进制数组 BIN_CODE=Bin0; div_t div_temp; //scanf("%d", &NUM_HEX); //确定输入正整数的个数 //NUM_OCT = NUM_HEX; //8进制数个数与16进制数相同 for(tag=0; tag<20; ++tag){ Hex[tag]= '0'; //全部初始设置为0,防止不确定数据生成 } for(tag=0; tag<80; ++tag){ Oct[tag]= '0'; //全部初始设置为0,防止不确定数据生成 } /***TODO 计划每转换一组数据就将数据存储在Oct数组中,然后重新初始化 Hex数组和Oct数组,再对Hex数组反复操作 将得到的数据分别存储在Binn数组中。。 最后输出 */ for(tag=0; tag<NUM_HEX; ++tag){ fflush(stdin); //清除缓存区 gets(Hex); //输入NUM_HEX个16进制数 //printf("%d",strlen(Hex)); if(tag==0) BIN_CODE=Bin0; if(tag==1) BIN_CODE=Bin1; if(tag==2) BIN_CODE=Bin2; if(tag==3) BIN_CODE=Bin3; if(tag==4) BIN_CODE=Bin4; if(tag==5) BIN_CODE=Bin5; if(tag==6) BIN_CODE=Bin6; if(tag==7) BIN_CODE=Bin7; if(tag==8) BIN_CODE=Bin8; if(tag==9) BIN_CODE=Bin9; for(num_tag=0; num_tag<strlen(Hex); ++num_tag){ switch(Hex[num_tag]) { case '0': tempInt=num_tag*4; BIN_CODE[tempInt]='0'; BIN_CODE[tempInt+1]='0'; BIN_CODE[tempInt+2]='0'; BIN_CODE[tempInt+3]='0'; BIN_CODE[tempInt+4]='\0'; break; case '1': tempInt=num_tag*4; BIN_CODE[tempInt]='0'; BIN_CODE[tempInt+1]='0'; BIN_CODE[tempInt+2]='0'; BIN_CODE[tempInt+3]='1'; BIN_CODE[tempInt+4]='\0'; break; case '2': tempInt=num_tag*4; BIN_CODE[tempInt]='0'; BIN_CODE[tempInt+1]='0'; BIN_CODE[tempInt+2]='1'; BIN_CODE[tempInt+3]='0'; BIN_CODE[tempInt+4]='\0'; break; case '3': tempInt=num_tag*4; BIN_CODE[tempInt]='0'; BIN_CODE[tempInt+1]='0'; BIN_CODE[tempInt+2]='1'; BIN_CODE[tempInt+3]='1'; BIN_CODE[tempInt+4]='\0'; break; case '4': tempInt=num_tag*4; BIN_CODE[tempInt]='0'; BIN_CODE[tempInt+1]='1'; BIN_CODE[tempInt+2]='0'; BIN_CODE[tempInt+3]='0'; BIN_CODE[tempInt+4]='\0'; break; case '5': tempInt=num_tag*4; BIN_CODE[tempInt]='0'; BIN_CODE[tempInt+1]='1'; BIN_CODE[tempInt+2]='0'; BIN_CODE[tempInt+3]='1'; BIN_CODE[tempInt+4]='\0'; break; case '6': tempInt=num_tag*4; BIN_CODE[tempInt]='0'; BIN_CODE[tempInt+1]='1'; BIN_CODE[tempInt+2]='1'; BIN_CODE[tempInt+3]='0'; BIN_CODE[tempInt+4]='\0'; break; case '7': tempInt=num_tag*4; BIN_CODE[tempInt]='0'; BIN_CODE[tempInt+1]='1'; BIN_CODE[tempInt+2]='1'; BIN_CODE[tempInt+3]='1'; BIN_CODE[tempInt+4]='\0'; break; case '8': tempInt=num_tag*4; BIN_CODE[tempInt]='1'; BIN_CODE[tempInt+1]='0'; BIN_CODE[tempInt+2]='0'; BIN_CODE[tempInt+3]='0'; BIN_CODE[tempInt+4]='\0'; break; case '9': tempInt=num_tag*4; BIN_CODE[tempInt]='1'; BIN_CODE[tempInt+1]='0'; BIN_CODE[tempInt+2]='0'; BIN_CODE[tempInt+3]='1'; BIN_CODE[tempInt+4]='\0'; break; case 'A': tempInt=num_tag*4; BIN_CODE[tempInt]='1'; BIN_CODE[tempInt+1]='0'; BIN_CODE[tempInt+2]='1'; BIN_CODE[tempInt+3]='0'; BIN_CODE[tempInt+4]='\0'; break; case 'B': tempInt=num_tag*4; BIN_CODE[tempInt]='1'; BIN_CODE[tempInt+1]='0'; BIN_CODE[tempInt+2]='1'; BIN_CODE[tempInt+3]='1'; BIN_CODE[tempInt+4]='\0'; break; case 'C': tempInt=num_tag*4; BIN_CODE[tempInt]='1'; BIN_CODE[tempInt+1]='1'; BIN_CODE[tempInt+2]='0'; BIN_CODE[tempInt+3]='0'; BIN_CODE[tempInt+4]='\0'; break; case 'D': tempInt=num_tag*4; BIN_CODE[tempInt]='1'; BIN_CODE[tempInt+1]='1'; BIN_CODE[tempInt+2]='0'; BIN_CODE[tempInt+3]='1'; BIN_CODE[tempInt+4]='\0'; break; case 'E': tempInt=num_tag*4; BIN_CODE[tempInt]='1'; BIN_CODE[tempInt+1]='1'; BIN_CODE[tempInt+2]='1'; BIN_CODE[tempInt+3]='0'; BIN_CODE[tempInt+4]='\0'; break; case 'F': tempInt=num_tag*4; BIN_CODE[tempInt]='1'; BIN_CODE[tempInt+1]='1'; BIN_CODE[tempInt+2]='1'; BIN_CODE[tempInt+3]='1'; BIN_CODE[tempInt+4]='\0'; break; default: printf("error input\n"); } //++bin_tag; } //BIN_TAG++; //每输入一次改变一次保存二进制数组的位置 } /* gets(Hex); printf("%d",strlen(Hex)); */ //puts(Bin0); /* for(tag = 0; tag < NUM_HEX; ++tag){ if(tag==0) BIN_CODE=Bin0; if(tag==1) BIN_CODE=Bin1; if(tag==2) BIN_CODE=Bin2; if(tag==3) BIN_CODE=Bin3; if(tag==4) BIN_CODE=Bin4; if(tag==5) BIN_CODE=Bin5; if(tag==6) BIN_CODE=Bin6; if(tag==7) BIN_CODE=Bin7; if(tag==8) BIN_CODE=Bin8; if(tag==9) BIN_CODE=Bin9; strcpy(Oct, BIN_CODE); //TEST puts(Bin0); } */ /* strcpy(Oct, Bin0); puts(Oct); */ /*******TODO 一个16进制数转成的2进制必然是4的整数倍 转换成8进制的对应代码需要为3的整数倍 如何确定开头? 如何在开头正确地添0并将每一位正确地后移? 为防止数据覆盖,先从最后一位开始后移,第一位移动时,在原来的位置覆盖‘0’. 怎么确定移动的个数呢? 如果生成的二进制码能够被3整除,则不需要移动,如果不能,则需要后移的个数为3-(整个数组长除以3的余数) */ for(tag=0; tag<NUM_HEX; ++tag){ if(tag==0) BIN_CODE=Bin0; if(tag==1) BIN_CODE=Bin1; if(tag==2) BIN_CODE=Bin2; if(tag==3) BIN_CODE=Bin3; if(tag==4) BIN_CODE=Bin4; if(tag==5) BIN_CODE=Bin5; if(tag==6) BIN_CODE=Bin6; if(tag==7) BIN_CODE=Bin7; if(tag==8) BIN_CODE=Bin8; if(tag==9) BIN_CODE=Bin9; //printf("%d\n", strlen(BIN_CODE)); div_temp = div(strlen(BIN_CODE), 3); tempInt = 3 - div_temp.rem; //需要后移的位数 //printf("\nthe number needs to put back is: %d\n", tempInt); //printf("BEFORE the length of BIN_CODE is: %d\n", strlen(BIN_CODE)); for(num_tag = strlen(BIN_CODE)-1; num_tag >= 0; --num_tag) { //循环后移 *(BIN_CODE+num_tag+tempInt) = *(BIN_CODE+num_tag); } //printf("NOW the length of BIN_CODE is: %d\n", strlen(BIN_CODE)); //前置0 for(num_tag=0; num_tag < tempInt; ++num_tag){ *(BIN_CODE+num_tag) = '0'; } //puts(BIN_CODE); } double RA = 0; double realInt = 0.00; for(num_tag=0; num_tag<strlen(BIN_CODE); num_tag++) { //printf("%d", num_tag); /** if(*(BIN_CODE+num_tag) == '0' && *(BIN_CODE+num_tag+1) == '0' && *(BIN_CODE+num_tag+2) == '0'){} if(*(BIN_CODE+num_tag) == '0' && *(BIN_CODE+num_tag+1) == '0' && *(BIN_CODE+num_tag+2) == '1'){printf("1");} if(*(BIN_CODE+num_tag) == '0' && *(BIN_CODE+num_tag+1) == '1' && *(BIN_CODE+num_tag+2) == '0'){printf("2");} if(*(BIN_CODE+num_tag) == '0' && *(BIN_CODE+num_tag+1) == '1' && *(BIN_CODE+num_tag+2) == '1'){printf("3");} if(*(BIN_CODE+num_tag) == '1' && *(BIN_CODE+num_tag+1) == '0' && *(BIN_CODE+num_tag+2) == '0'){printf("4");} if(*(BIN_CODE+num_tag) == '1' && *(BIN_CODE+num_tag+1) == '0' && *(BIN_CODE+num_tag+2) == '1'){printf("5");} if(*(BIN_CODE+num_tag) == '1' && *(BIN_CODE+num_tag+1) == '1' && *(BIN_CODE+num_tag+2) == '0'){printf("6");} if(*(BIN_CODE+num_tag) == '1' && *(BIN_CODE+num_tag+1) == '1' && *(BIN_CODE+num_tag+2) == '1'){printf("7");} */ realInt = strlen(BIN_CODE) - num_tag - 1; //RA += pow(2, realInt); if(realInt != 0 && *(BIN_CODE+num_tag) == '1'){ RA += pow(2, realInt); } //printf("R%f\n", RA); } //printf("\n%d\n", num_tag); if(*(BIN_CODE+num_tag-1) == '1') RA++; printf("%.0f", RA); /* puts(Bin0); puts(Bin1); puts(Bin2); puts(Bin3); puts(Bin4); puts(Bin5); puts(Bin6); puts(Bin7); puts(Bin8); puts(Bin9); */ return 0; }
从之前写的16转8稍微改了一下。。