BASIC-11 十六进制转十进制(无符号变量 字符串数组指针)

问题描述
  从键盘输入一个不超过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;
}
发布了16 篇原创文章 · 获赞 0 · 访问量 281

猜你喜欢

转载自blog.csdn.net/tygmc/article/details/103901078