描述
写出一个程序,接受一个十六进制的数,输出该数值的十进制表示。
数据范围:保证结果在 1 \le n \le 2^{31}-1 \1≤n≤231−1
输入描述:
输入一个十六进制的数值字符串。
输出描述:
输出该数值的十进制字符串。不同组的测试用例用\n隔开。
示例1
输入:
0xAA复制
输出:
170
int main(void) { //0xFFFFFFFF unsigned int data = 0; char buffer[11]; while ( EOF != scanf("%s", buffer)) { int len = strlen(buffer) - 2; char ch = 0; for(int i=0;i<len;i++) { ch = buffer[len+1-i]; if(ch>='0'&&ch<='9') ch = 0 + ch - '0'; else if (ch>='a'&&ch<='f') ch = 10 + ch - 'a'; else if(ch>='A'&&ch<='F') ch = 10 + ch - 'A'; else return 0; data += ch << (4*i); } printf("%ld\n", data); //ld } return 0; }
printf 要用 %ld 来处理 unsigned int 类型的 无符号数,
#include<stdio.h> int main() { unsigned int a; while(scanf("%x",&a)!=EOF) // %i 有符号十进制数 { printf("%ld\n",a); //这里要ld, %d是有符号的int类型 } return 0; }
一、%d与%i的区别:
(1)在printf格式中使用,没有区别。
(2)在 scanf 格式串中使用时,区别如下:
a. 在scanf格式中,%d 只与十进制形式的整数相匹配。
b. 而%i 则可以匹配八进制、十进制、十六进制表示的整数。·
c. 例如:如果输入的数字有前缀 0(018、025),%i将会把它当作八进制数来处理,如果有前缀0x (0x54),它将以十六进制来处理。
二、%p和%x的区别:
(1)输出类型相同:都是无符号十六进制。
(2)输出结果不同:
a. %p以十六进制的形式是打印地址,编译器多少位,就打印多少位。比如:32位的打印32位,64位打印64位(不够的左边补0);
b. %x的输出位数不固定,比如:0x01,0x0101,0x01010101等。
c. %02x: 02表示不足两位,前面补0输出;如果超过两位,则实际输出。%.2x效果和%02x相同。%-2x,数据不足两位时,后面补空格输出,不额外补0输出; 如果超过两位,则实际输出