BCD数是用一个字节来表达两位十进制的数,每四个比特表示一位。所以如果一个BCD数的十六进制是0x12,它表达的就是十进制的12。但是小明没学过BCD,把所有的BCD数都当作二进制数转换成十进制输出了。于是BCD的0x12被输出成了十进制的18了!
现在,你的程序要读入这个错误的十进制数,然后输出正确的十进制数。提示:你可以把18转换回0x12,然后再转换回12。
输入格式:
输入在一行中给出一个[0, 153]范围内的正整数,保证能转换回有效的BCD数,也就是说这个整数转换成十六进制时不会出现A-F的数字。
输出格式:
输出对应的十进制数。
输入样例:
18
输出样例:
12
最开始我的想法是将输入的那个数转换成十六进制的数,这样我就可以得到结果了。
#include<stdio.h> int main() { int num=0; int a[100]; int i=0; int m=0; int b; char hex[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; scanf("%d",&num); while(num>0) { b=num%16; a[i++]=b; num=num/16; } // printf("转化为十六进制的数为:0x"); for(i=i-1;i>=0;i--) { m=a[i]; printf("%c",hex[m]); } printf("\n"); return 0; }
但是得出结果为
也就是当我输入的数为0时,这个程序就是错的。
最后我查了一下别人的程序,如下:
#include <stdio.h> int main() { int num,num1,num2; scanf("%d",&num); num1=num/16; num2=num%16; printf("%d",num1*10+num2); return 0; }
??????就这样??????(满脸问号)
总结:对于这题,我最先是对BCD码的不理解,于是我去百度了一下。懂了BCD码后,我又来做这道题,我的思路是先将数转换成十六进制,再将十六进制转换成BCD码,最后再转成十进制,要不是十六进制转换成BCD码太过于复杂,我可能真的会这样做。最后我搜了别人的答案之后,我才发现我想的太复杂了,这道题也根本不用理解BCD码是啥,只用懂得十进制与十六进制之间的关系就行。