题目描述
输入一个数字,其进制数可能为以下四种形式:
二进制:以0b开头,包含字符0和1;
八进制:以0开头,包含字符0~7;
十进制:包含字符0-9,且除了自然数0以外的数字不以0开头;
十六进制:以0x开头,包含字符0~9和a~f。
请你将输入数字转换为十进制数字输出。
注意:若输入为0,我们认为它是十进制数,可直接输出0
输入
输入一个数字,其进制为以上四种之一。以换行结尾。
输出
输出转换后的十进制数。
输入样例1:0x1a 输出样例1:26
输入样例2:0101 输出样例2:65
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
int main() {
char arr[10] = { 0 };
scanf("%s", &arr);
int len = strlen(arr);
int sum = 0;
int power = 0;
if (arr[0] == '0') {
if (arr[1] == 'x') {
/*16*/ for (int i = 2; i < len; i++) {
int digit = 0;
if (arr[i] >= '0' && arr[i] <= '9') {
digit = arr[i] - '0';
}
if (arr[i] >= 'a' && arr[i] <= 'f') {
digit = arr[i] - 'a' + 10;
}
power = len - i - 1;
sum += digit * pow(16, power);
}
printf("%d\n", sum);
}
else if (arr[1] == 'b') {
/*2*/ for (int i = 2; i < len; i++) {
int digit = arr[i] - '0';
power = len - i - 1;
sum += digit * pow(2, power);
}
printf("%d\n", sum);
}
else if (arr[1] > '0' && arr[1] <= '7') {
/*8*/ for (int i = 1; i < len; i++) {
int shu = arr[i] - '0';
int power = len - i - 1;
sum += shu * pow(8, power);
}
printf("%d\n", sum);
}
else {
/*10*/ printf("%s\n", arr);
}
}
else {
printf("%s\n", arr);
}
return 0;
}
代码思路:1.先用strlen函数计算字符串的长度,即输入的位数;
2.进行分类:二进制,八进制,十六进制都以0开头,而十进制初自然数0之外都不已零开头.
再分类:二进制:以0b开头;八进制:以0开头,后面都为数字;十六进制:以0x开头.
3.计算是把其他进制转化为十进制.
同时,需要注意的是用arr[i]取出来的值是这个数所对应的ascll码值,需要进行转换.