问题描述
从键盘输入一个不超过8位的正的十六进制数字符串,将它转换为正的十进制数后输出。
注:十六进制数中的10~15分别用大写的英文字母A、B、C、D、E、F表示。
样例输入
FFFF
样例输出
6553
说明:第一次引用了太多变量 ,代码质量不高
#include<stdio.h>
unsigned int fun(char c[9]) //函数类型可以是int,因为输出按无符号输出
{
unsigned int i,j,k,a,b=1,sum=0; //十六进制的八位最大值=2^32-1,故用无符号
for(i=0;c[i]!='\0';i++); //求出位数
k=i; //用于循环求指数
for(;i>0;i--) //从低位开始循环
{
if(c[i-1]>='A') //判断是否为10~15
{
a=c[i-1]-'A'+10; //求该位的十进制数值
j=i; //求位数对应指数的循环变量
for(;j<k;j++)
b=b*16; //求出位数对应指数
sum=sum+a*b; //求出该数的转换
b=1; //每次循环重新赋值
}
else
{
a=c[i-1]-'0';
j=i;
for(;j<k;j++)
b=b*16;
sum=sum+a*b;
b=1;
}
}
return sum;
}
int main()
{
char c[9]; //字符串最长为八,加个'\0'
gets(c); //字符串输入函数
printf("%u",fun(c)); //无符号输出
return 0;
}
说明:对代码进行优化,减少变量,只用一层循环
#include<stdio.h>
unsigned int fun(char c[9])
{
unsigned int i,a,b=1,sum=0;
for(i=0;c[i]!='\0';i++);
for(;i>0;i--)
{
if(c[i-1]>='A')
{
a=c[i-1]-'A'+10;
sum=sum+a*b;
b=b*16;
}
else
{
a=c[i-1]-'0';
sum=sum+a*b;
b=b*16;
}
}
return sum;
}
int main()
{
char c[9];
gets(c);
printf("%u",fun(c));
return 0;
}
说明:从高位开始运算,利用指针进行优化
#include<stdio.h>
unsigned int fun(char *p)
{
int a,sum=0;
while(*p) //遇到'\0'结束
{
if(*p>='A')
{
a=*p-'A'+10;
sum=sum*16+a; //从高位开始循环
}
else
{
a=*p-'0';
sum=sum*16+a;
}
p++;
}
return sum;
}
int main()
{
char c[9];
gets(c);
printf("%u",fun(c));
return 0;
}