蓝桥杯十六进制转化为十进制,想问问哪有问题

蓝桥杯十六进制转化为十进制,想问问哪有问题

#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