翁恺(浙江大学)BCD解密 初学者解题思路共享,如有问题欢迎指正!

本人初步跟学翁恺老师的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为例:

当我们把每四个比特看作一个数,这道题就成为一道算术题,得出两者之间的关系。

\begin{cases} & T1=a\times 16+b; \\ & T2=a\times 10+b; \end{cases}\Rightarrow T2 = F(T1)

除此之外,根据二进制转换十六进制的算法,每四个比特为一位,转化成十进制数,然后记作对应的十六进制数,与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;
 }

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
浙江大学翁恺C语言课件是浙江大学计算机学院教授翁恺编写的一套C语言课程教材。这套课件主要用于C语言的教学与学习,内容包括基本语法、数据类型、运算符、流程控制、函数、指针、数组、字符串等C语言的基础知识。 这套课件具有以下几个特点。首先,它简单易懂,适合初学者学习。翁恺老师针对C语言的特点和学习难点,将知识点进行了简洁明了的讲解,同时结合了大量的示例和练习,帮助学生更好地理解和掌握C语言的编程思路和技巧。 其次,课件内容丰富全面。翁恺老师在编写课件时,充分考虑到C语言的广泛应用领域和学生的学习需求,涵盖了C语言的各个方面,包括基础语法、程序设计、算法、数据结构等内容,帮助学生建立正确的编程思维和解决实际问题的能力。 再次,课件设计灵活多样。为了培养学生的动手实践能力,课件中设计了丰富的编程实例和实践项目,学生可以边学边练,不断巩固和提高自己的编程能力。此外,课件中还包含了一些扩展知识,如文件操作、动态内存管理等,有助于学生进一步拓宽视野。 总之,浙江大学翁恺C语言课件是一套权威且实用的C语言学习资料,通过学习这套课件,学生可以系统地学习和掌握C语言的基础知识,提高编程能力,并为日后的学习和工作打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值