问题描述:
输入一个十六进制数,输出相应的十进制数。
示例:
输入:a11
输出:2577
方法:将十六进制存储到字符串数组中,依次遍历每个字符,根据进制转换公式计算出相应的十进制。a或A的十进制为10,所以要用字符的ASCII码减去对应的数之后才用来计算。如:'a'-87=10,'b'-87=11...‘A’-55=10,‘B’-55=11;
进制转换公式:举例 :a11=10(a)*16^2+1*16^1+1*16^0=2577。用当前的数乘以基数的次方,16进制,所以基数是16,次方是位置-1。位置从右往左数。
代码:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>
#include<math.h>
int caculate(char str[],int n) {
int i, num = 0;
for (i = 0; str[i] != '\0'; i++) {
if (str[i] >= 'a' && str[i] <= 'z') {//判断是大写还是小写,要通过ASCII值计算
num += (str[i] - 87) * (pow(16, --n));//小写要减87,然后乘以基数的次方,
//次方是位置-1
}
else if (str[i] >= 'A' && str[i] <= 'Z') {
num += (str[i] - 55) * pow(16, --n);//大写要减55
}
else {
num += (str[i]-48) * pow(16, --n);//数字,但还是字符形式的数字,所以要减48,
//ASCII中48为‘0’
}
}
return num;
}
int main() {
char str[32];
printf("请输入16进制:");
gets(str);
printf("该16进制的十进制数为:%d\n", caculate(str, strlen(str)));//srtlen(str)计算长度,
//为16的次方做准备
return 0;
}
运行结果截图:
16进制用大小写都可以,上面代码中都有相应的判断。