问题描述:
将一个十六进制数转换为相应的十进制数输出。
算法分析:
首先,输入一个十六进制数时,这个字符串必须是0~9与a~f(或A~F)这些字符组成的,必须先进行识别判断是否合法。
下面通过一个例子说明转换的方法。假设需将十六进制数12aF转换为十进制数n。
n = 1*16^3 + 2*16^2 + a*16^1 + F * 16^0 = (((1*16)*16+2)*16+a)*16+F
算法实现过程如下:
n = 1*16
n = n*16+2
n = n*16+10 其中,a对应的十进制数为10
n = n*16+15 其中,F对应的十进制数为15
在字母a~f或A~F转换为整数的过程中,因为a~f(或A~F)分别代表十进制数的10~15,假设x是a~f或A~F中任意一个字符,
所以只要式子x-a+10或x-A+10,就可能将其转换为十进制的整数。
源代码:
#include<stdio.h>
#define MAX 100
int main()
{
int htoi(char s[]);
char t[MAX],c;
int i=0,flag = 0,flag1 = 1;
printf("\nInput a hex number:");
while((c = getchar()) != '\0' && i < MAX && flag1)
{
if(c >='0' && c <= '9'|| c>='a' && c<='f'|| c >='A' && c <= 'F')
//判断输入的字符串是否合法
{
flag = 1;
t[i++] = c;
}
else if(flag)
{
t[i] = '\0';
printf("decimal number is %d\n",htoi(t));
printf("continue or not?");
c = getchar();
if(c == 'N' && c == 'n')
flag1 =0;
else
{
flag = 0;
i = 0;
printf("\nInput a hex number");
}
}
}
return 0;
}
int htoi(char s[]) //将十六进制转换为十进制
{
int i,n=0;
for(i=0;s[i] != '\0';i++)
{
if(s[i] >= '0' && s[i] <= '9')
n = n*16 + s[i] - '0';
if(s[i] >= 'a' && s[i] <= 'f')
n = n*16 + s[i] - 'a'+10;
if(s[i] >= 'A' && s[i] <= 'F')
n = n*16 +s[i]-'A'+10;
}
return n;
}
十进制转换为十六进制(选自百度,我觉得不错):
源代码:
#include<stdio.h>
char tohex(int n)
{
if(n>=10 && n<=15)
{
return 'A'+n-10;
}
return '0'+n;
}
void dec2hex(int n,char *buf)
{
int i=0;
int mod;
while(n)
{
mod = n%16;
buf[i++]=tohex(mod);
n=n/16;
}
//得进行反序。
int j,k;
for(j=0,k=i-1;j<i/2;j++,k--)
{
char temp;
temp = buf[j];
buf[j] = buf[k];
buf[k] = temp;
}
buf[i]='\0';
}
int main()
{
int n;
scanf("%d",&n);
char a[32];
dec2hex(n,a);
printf("%s",a);
return 0;
}