C语言实现16进制转10进制(包含小数部分)

这是我参与11月更文挑战的第18天,活动详情查看:2021最后一次更文挑战

原理就跟我们平常手动的去16进制转10进制一样,是通过最常用的按权展开的方法,即位权,那么为了将输入的16进制分开,方便我们进行每位按权去求10进制,我们可以用一个字符数组通过下标来实现这种需要。

想法:

通过按权展开的方法:
(BC)H=11x16^1 + 12x16^0

步骤:

1.用字符数组来放16进制
2.将数组元素逆序排放
3.将数组元素的下标当做16进制的权
4.将字符转换成数字 * 16的权

代码实现

float fun(int n)   //递归函数实现16的N次方
{
    if(n==0)
        return 1;
    else
        return  16*fun(n-1);
}
void main()
{
   char s[20],*s1=s,*s2=s,*s3=s,t;
   int num;
   float sum=0.0;
     gets(s);
   while(*s1) s1++;
   for(num=s1---s;s2<s1;s2++,s1--)      //将数组元素逆序排放
           t=*s2,*s2=*s1,*s1=t;//数组元素的下标当做16进制的权
   while(*s3)
   {
       if(*s3=='.')
           break;
       s3++;
   }
   for(s1=s;s1<s+num;s1++)
     {
        if(s1-s3<0&&*s3=='.')                  //求小数部分,*s3='.',说明有小数
        {
            if(*s1>=48&&*s1<=57)              //根据小数点的下标确定16的权
                sum=sum+(*s1-48)/fun(s3-s1);   //将字符转换成数字 * 16的权
            else  if(*s1>='A'&&*s1<='Z')
                sum=sum+(*s1-55)/fun(s3-s1);
            else  if (*s1>='a'&&*s1<='z')
                sum=sum+(*s1-87)/fun(s3-s1);
        }
        else  if(*s3=='.')                        //求整数部分,*s3='.',说明有小数
        {
            if(*s1>=48&&*s1<=57)                 //根据小数点的下标确定16的权
                sum=sum+(*s1-48)*fun(s1-s3-1);    //将字符转换成数字 * 16的权
            else  if(*s1>='A'&&*s1<='Z')
                sum=sum+(*s1-55)*fun(s1-s3-1);
            else  if (*s1>='a'&&*s1<='z')
                sum=sum+(*s1-87)*fun(s1-s3-1);
        }
        else
        {
            if(*s1>=48 && *s1<=57)         //将字符转换成数字 * 16的权
                sum=sum+(*s1-48)*fun(s1-s);
            else  if(*s1>='A'&&*s1<='Z')
                sum=sum+(*s1-55)*fun(s1-s);
            else  if (*s1>='a'&&*s1<='z')
                sum=sum+(*s1-87)*fun(s1-s);
        }
    }
    printf("%f",sum);
}
复制代码