蓝桥杯十六进制转化为十进制,想问问哪有问题
#include
#include
#include
int main (void)
{
int j,len,temp;
char a[8];
temp=0;
scanf("%s",&a);
len=strlen(a);
for(j=0;jcase '1':temp+=1*pow(16,len-j-1);break;
case '2':temp+=2*pow(16,len-j-1);break;
case '3':temp+=3*pow(16,len-j-1);break;
case '4':temp+=4*pow(16,len-j-1);break;
case '5':temp+=5*pow(16,len-j-1);break;
case '6':temp+=6*pow(16,len-j-1);break;
case '7':temp+=7*pow(16,len-j-1);break;
case '8':temp+=8*pow(16,len-j-1);break;
case '9':temp+=9*pow(16,len-j-1);break;
case 'A':temp+=10*pow(16,len-j-1);break;
case 'B':temp+=11*pow(16,len-j-1);break;
case 'C':temp+=12*pow(16,len-j-1);break;
case 'D':temp+=13*pow(16,len-j-1);break;
case 'E':temp+=14*pow(16,len-j-1);break;
case 'F':temp+=15*pow(16,len-j-1);break;
default:temp+=0;
}
}
printf("%d",temp);
return 0;
}
没什么大问题,有三点优化的:
scanf("%s",&a) 输入时不需要在字符数组前加 & 号。
在使用 pow 函数时,参数 16 是一个常量,不需要在每次使用时都重新计算。你可以把它提前计算出来,减少计算时间。
对于 temp 的初始值,可以不用显式赋值,因为默认初始值为 0。
int ch_hex_to_num(char ch)
{
if(('0'<= ch) && (ch <= '9'))
return ch-'0';
if(('a' <= ch) && (ch <= 'f'))
return ch -'a' +10;
if(('A' <= ch) && (ch <= 'F))
return ch -'A' +10;
return -1;
}
unsigned int str_hex_to_num(char *str)
{
int i, len,ch;
unsigned int data;
if(!str)
return 0;
len=strlen(str);
data=0;
for(i=0; i<len;i++)
{
ch = ch_hex_to_num(str[i]);
if(ch < 0)
break;
data = (data <<4) | ch;
}
return data;
}
这个就可以 “12af” 转化成0x12af