本人初步跟学翁恺老师的C语言程序设计,遇到BCD解密一题,分享我的解题思路,如有问题欢迎指正!
前提条件:本人还未知晓BCD数,但已知晓二进制、十进制、十六进制的进位制。
题目:
BCD数是用一个字节来表达两位十进制的数,每四个比特表示一位。所以如果一个BCD数的十六进制是0x12,它表达的就是十进制的12。但是小明没学过BCD,把所有的BCD数都当作二进制数转换成十进制输出了。于是BCD的0x12被输出成了十进制的18了!
现在,你的程序要读入这个错误的十进制数,然后输出正确的十进制数。提示:你可以把18转换回0x12,然后再转换回12。
输入格式:
输入在一行中给出一个[0, 153]范围内的正整数,保证能转换回有效的BCD数,也就是说这个整数转换成十六进制时不会出现A-F的数字。
输出格式:
输出对应的十进制数。
输入样例:
18
输出样例:
12
本人答题思路:
出题人意思为应该是原有XXXX XXXX的8个比特数为BCD数,小明以为是二进制数,故在转为十进制数中发生错误,以0001 0010为例:
现在题目需要将①的结果转换为②的结果,最保守的做法是18→0001 0010→12,显然对于初学者来说较为复杂。
若我们从两者转十进制的逻辑角度出发,依旧以0001 0010为例:
当我们把每四个比特看作一个数,这道题就成为一道算术题,得出两者之间的关系。
除此之外,根据二进制转换十六进制的算法,每四个比特为一位,转化成十进制数,然后记作对应的十六进制数,这与BCD数转十进制的算法相近。且题中已明确BCD数是用来表达两位十进制的数,如果一个BCD数的十六进制是0x12,它表达的就是十进制的12,可以明确在转换过程中不会出现A-F。因此,这道题也可以看作是一道十进制转换为不会出现A-F十六进制的题目。
参考答案:
#include <stdio.h>
int main()
{
int i;
scanf("%d", &i);
int t = i % 16 + i / 16 * 10;
printf("%d", t);
return 0;
}