在一行上输入一个十六进制数
,代表待转换的十六进制数。
保证
转化得到的十进制数
的范围为
。
在一行上输出一个整数,代表
对应的十进制数。
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; }