C语言实现16进制转10进制(包含小数部分)
想法:
通过按权展开的方法:
(BC)H=11x16^1 + 12x16^0
步骤:
1.用字符数组来放16进制
2.将数组元素逆序排放
3.将数组元素的下标当做16进制的权
4.将字符转换成数字 * 16的权
代码实现
floatfun(intn) //递归函数实现16的N次方{ if(n==0) return1; elsereturn16*fun(n-1); } voidmain() { chars[20],*s1=s,*s2=s,*s3=s,t; intnum; floatsum=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的权elseif(*s1>='A'&&*s1<='Z') sum=sum+(*s1-55)/fun(s3-s1); elseif (*s1>='a'&&*s1<='z') sum=sum+(*s1-87)/fun(s3-s1); } elseif(*s3=='.') //求整数部分,*s3='.',说明有小数 { if(*s1>=48&&*s1<=57) //根据小数点的下标确定16的权sum=sum+(*s1-48)*fun(s1-s3-1); //将字符转换成数字 * 16的权elseif(*s1>='A'&&*s1<='Z') sum=sum+(*s1-55)*fun(s1-s3-1); elseif (*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); elseif(*s1>='A'&&*s1<='Z') sum=sum+(*s1-55)*fun(s1-s); elseif (*s1>='a'&&*s1<='z') sum=sum+(*s1-87)*fun(s1-s); } } printf("%f",sum); }