一、十六--->十
思路:把十六进制的字符串看做十进制的字符串,按照十进制字符串转换为数字的方法,从高位到地位逐个字符处理。
代码:
#include<stdio.h>
#include<string.h>
/*根据需要跟换 M 的值,以处理更多位数的十六位字符*/
#define M 10
/*
处理字符串,返回10进制数字
*/
long long toTen(char s[]){
int i;
/*
long long 为适应比较大的数字,
若数据太大,就要使用数组处理
*/
long long d=0;
for(i=0; s[i]; i++)
{
/*
d = d * 10 提升 d 的位数,给当前处理的字符留出位置
*/
d=d*16;
/*
如果s[i] 是 0 ~ 9的数字,直接加上 s[i] - '0'
*/
if(s[i]>='0' && s[i]<='9')
d=d+s[i]-'0';
/*
字母要区分大小写
*/
else if(s[i]>='a' && s[i]<='f')
{
d=d+s[i]-'a'+10;
}
else if(s[i]>='A' && s[i]<='F')
{
d=d+s[i]-'A'+10;
}
}
return d;
}
int main(){
char str[M];
gets(str);
printf("%lld",toTen(str));
return 0;
}
二、十-->十六
思路:简单的 除 k 取余法
代码:
#include<stdio.h>
/*最多处理50为的十进制数字字符串,可根据需要更改*/
#define M 50
int main(){
int i=0,j,len,temp;
long num;
char str[M];
scanf("%ld",&num);
do{
/*除 k 取余 */
temp = (num%16);
/*根据余数确定十六进制的各位上的数字*/
/*余数小于 10 ,加字符 ‘0’*/
if(temp<10){
str[i] = temp+'0';
}else{
/*余数大于 10 ,加字符 ‘A’(当然也可以是小 a */
str[i] = temp - 10 + 'A';
}
i++;
/*除 K 取整*/
num/=16;
}while(num);
/*倒叙输出数组str的各个字符*/
for(j=i-1;j>=0;j--){
printf("%c",str[j]);
}
return 0;
}