PTA基础编程题目集 7-4 BCD解密(C语言实现)

发布时间:2026/7/26 7:10:46
PTA基础编程题目集 7-4 BCD解密(C语言实现) 题目描述摘要本文介绍了一道基于 BCD 码误解的编程题。题目给出一个被错误当作二进制数转成十进制的 BCD 值范围 0–153要求程序将其还原为正确的十进制数。核心思路是将错误值的高 4 位和低 4 位分离再按十进制位权十位×10 个位组合输出。BCD 数是用一个字节来表达两位十进制的数每四个比特表示一位。所以如果一个 BCD 数的十六进制是 0x12它表达的就是十进制的 12。但是小明没学过 BCD把所有的 BCD 数都当作二进制数转换成十进制输出了。于是 BCD 的 0x12 被输出成了十进制的 18 了现在你的程序要读入这个错误的十进制数然后输出正确的十进制数。提示你可以把 18 转换回 0x12然后再转换回 12。输入格式输入在一行中给出一个[0, 153]范围内的正整数保证能转换回有效的BCD数也就是说这个整数转换成十六进制时不会出现A-F的数字。输出格式输出对应的十进制数。输入样例18输出样例12原始十进制数12BCD 编码0x12每4位表示一位十进制小明误解当作二进制按位权转为十进制错误输出18即 0x12 162 18程序读入错误值 n 18提取高4位n / 16 1提取低4位n % 16 2十位 × 10 个位1 × 10 2 12输出正确结果12代码部分实现#includestdio.hintmain(){intn;scanf(%d,n);// 读入小明转换出的“错误的十进制数”例如 18// 小明把 BCD 数如 0x12当成二进制数转换成十进制// 所以他得到的值其实就是 BCD 数的十六进制表示本身。// 例如 0x12 → 0001 0010 → 二进制值 18 就是 0x12 的十进制形式。// 因此 n 确实等于原始 BCD 的十六进制值。// 分离十六进制的高 4 位十位和低 4 位个位// n / 16 相当于右移 4 位得到高 4 位的值0–9 之间的十位数字inthigh_digitn/16;// n % 16 相当于与 0x0F 按位与得到低 4 位的值0–9 之间的个位数字intlow_digitn%16;// 按十进制位权重新组合十位 × 10 个位intresulthigh_digit*10low_digit;printf(%d\n,result);// 输出正确的十进制数例如 12return0;}算法步骤总结读入错误值scanf(%d, n)获取小明误解后输出的十进制数该值恰好就是原始 BCD 数的十六进制表示因为小明把它当二进制数转成了十进制。提取十位high_digit n / 16。整数除法相当于将二进制表示右移 4 位截取高 4 位对应原 BCD 的十位数字取值范围 0–9。提取个位low_digit n % 16。取模运算相当于只保留低 4 位对应原 BCD 的个位数字取值范围 0–9。重组正确值result high_digit * 10 low_digit。将提取出的十位和个位按十进制位权相加得到原本的 BCD 十进制表示。输出printf(%d\n, result)打印正确答案。

相关新闻