在一行上输入一个十六进制数
,代表待转换的十六进制数,格式见题干。保证
转化得到的十进制数
的范围为
。
在一行上输出一个整数,代表
对应的十进制数。
0xFA93
64147
回忆十六进制转化为十进制的方法:从右往左,将第
位乘以
,然后求和。
在这个样例中,
的第
位是
,第
位是
,第
位是
,第
位是
,因此
。
#include <stdio.h>
#include <string.h>
int main() {
char s[100]; // 定义一个足够大的字符数组来存储输入的字符串
int i, num = 0, power = 1;
// 读取输入的字符串
scanf("%s", s);
// 跳过 "0x" 前缀
if (s[0] == '0' && s[1] == 'x') {
// 从第三个字符开始处理
for (i = strlen(s) - 1; i >= 2; i--) {
// 处理每一位字符
if ((s[i])>='0'&&(s[i])<='9') {
// 数字字符
num += (s[i] - '0') * power;
} else {
// 字母字符
if ((s[i])>='A' && (s[i])<='Z') {
num += (s[i] - 'A' + 10) * power;
} else if((s[i])>='a' && (s[i])<='z') {
num += (s[i] - 'a' + 10) * power;
}
}
// 更新权值
power *= 16;
}
}
// 输出结果
printf("%d\n", num);
return 0;
} #include <stdio.h>
int main() {
unsigned int s;
scanf("%x", &s);
printf("%u\n", s);
return 0;
} #include <stdio.h>
#include <math.h>
int main() {
int x_16, i, digit = 0;
int x_10 = 0;
char str[5];
scanf("%x", &x_16);
//printf("%u", x_16); //速通路线
sprintf(str, "%x", x_16); //将十六进制数转换为字符串
while (str[digit++] != '\0') {
}
digit--; //抵消上面多加的一次
for (i = 0; i < digit; i++) {
if ((str[i] >= 65 && str[i] <= 70) || (str[i] >= 97 &&
str[i] <= 102)) { //ASCII码转化
x_10 += (int)pow(16, digit - i - 1) * (str[i] > 77 ? str[i] - 87 : str[i] - 55);
} else {
x_10 += (int)pow(16, digit - i - 1) * (str[i] - 48);
}
}
printf("%d", x_10);
return 0;
} #include <stdio.h>
#include<string.h>
int main()
{
int num=0;
char str[100];
char b[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
int shiji = 0;
printf("输入十六进制数0x");
fgets(str, sizeof(str), stdin); // 使用fgets安全读取整行字符串
num = strlen(str);
str[num]= '\0';
int index = 1;
for (int i = num-1; i >=0;)
{
for (int j = 0;j < 16; j++)
{
if (j < 10)
{
if (str[i] == b[j])
{
shiji = shiji+j*index;
index = index * 16;
}
}
if (j >= 10 && j <= 15)
{
if (str[i] == b[j])
{
shiji = shiji + j * index;
index = index * 16;
}
}
}
i--;
}
printf("%d\n", shiji);
return 0;
} #include <stdio.h>
unsigned int cal_mi(unsigned int arg, int i)
{
unsigned int res = 1;
while(i--)
res *= arg;
return res;
}
int main() {
int i = 0;
unsigned int hex;
unsigned int res=0;
while(scanf("%x", &hex) != EOF)
{
for (i=0; i < 32 ; i++){
if ((hex >> i) & 0x1)
res += cal_mi(2,i);
}
printf("%u\n", res);
}
return 0;
} /** 题目:HJ5 进制转换
* 思路:数据用 %x 十六进制输入,输出 %d 十进制
* 难点:内置的十六进制输入和十进制输出
*/
#include <stdio.h>
int main() {
int num;
scanf("%x", &num);
printf("%d", num);
return 0;
}
/** 题目:HJ5 进制转换
* 思路:输入数据用字符串存储,从第三位字符开始遍历字符串,用秦九韶算转化进制
* 难点:字符串的 abcdef 、ABCDEF 和 0123456789 如何转化为十进制数
*/
#include <stdio.h>
#include <string.h>
int main() {
char str[20];
int num = 0;
int len;
gets(str);
len = strlen(str);
// 用秦九韶算法转化进制,分情况讨论: aA、bB、cC、dD、eE、fF分开讨论,0123456789 转化为数字后表示 48~57,减去48
for(int i = 2; i < len; i++) {
switch (str[i]) {
case 'a':
case 'A':
num = num * 16 + 10;
break;
case 'b':
case 'B':
num = num * 16 + 11;
break;
case 'c':
case 'C':
num = num * 16 + 12;
break;
case 'd':
case 'D':
num = num * 16 + 13;
break;
case 'e':
case 'E':
num = num * 16 + 14;
break;
case 'f':
case 'F':
num = num * 16 + 15;
break;
default:
// 字符中的 0123456789 转化为 int 型后表示 48 ~ 57,-48 即可表示 0 ~ 9
num = num * 16 + ((int)str[i] - 48);
break;
}
}
printf("%d", num);
return 0;
}