数学知识用起来!进制转换CSP入门级真题同款挑战

四季读书网 4 0
数学知识用起来!进制转换CSP入门级真题同款挑战
刚才我们聊了十进制和位值原理,很多小朋友可能会问:“学这些除了背口诀,还有什么用呀?”

告诉你们一个大秘密:位值原理是编程里最常用的数学知识之一!几乎每年的 CSP 信息学奥赛入门级,都会考到进制转换的题目,而所有进制转换的核心,就是我们今天学的 “位值原理”。

数学知识用起来!进制转换CSP入门级真题同款挑战 第1张

下面这道题,就是 CSP-J 入门级第一题的难度,专门为今天的内容设计的,快来挑战一下吧!

题目:十二进制乘法口诀

题目描述如果人类有 12 根手指,我们就会使用十二进制计数。十二进制用 0-9 和 A、B 这 12 个符号表示数字,其中 A 代表十进制的 10,B 代表十进制的 11。

在十二进制中,乘法口诀会背到 “BB”(也就是 11×11)。现在请你写一个程序,输入两个十二进制的一位数,输出它们乘积的十二进制表示。

输入格式一行,两个字符,用空格隔开,分别是两个十二进制的一位数(0-9、A、B,保证是大写字母)。

输出格式一行,乘积的十二进制表示(10 用 A 表示,11 用 B 表示)。

输入样例 

2 3

输出样例 

6

解题思路(核心就是今天学的位值原理!看另一篇文章)

  1. 不管什么进制,位值原理都是一样的:只是基数从 10 变成了 12
  2. 第一步:把输入的两个十二进制字符,转换成十进制的整数
  3. 第二步:计算两个十进制整数的乘积
  4. 第三步:把乘积再转换回十二进制,输出结果
  5. #include<iostream>usingnamespacestd;intmain(){char c1, c2;cin >> c1 >> c2;// 把字符转换成十进制数字(核心:字符的ASCII码运算)int a, b;if (c1 >= '0' && c1 <= '9') a = c1 - '0';else a = 10 + (c1 - 'A'); // 'A'对应10,'B'对应11if (c2 >= '0' && c2 <= '9') b = c2 - '0';else b = 10 + (c2 - 'A');// 计算乘积int product = a * b;// 把乘积转换成十二进制并输出if (product >= 12) {int shi = product / 12// 十二进制的十位(位值:12^1)int ge = product % 12// 十二进制的个位(位值:12^0)// 输出十位if (shi < 10cout << shi;elsecout << (char)('A' + shi - 10);// 输出个位if (ge < 10cout << ge;elsecout << (char)('A' + ge - 10);    } else {// 乘积小于12,直接输出个位if (product < 10cout << product;elsecout << (char)('A' + product - 10);    }cout << endl;return0;}
  6. 这道题的核心逻辑,和我们把十进制数拆成 “几个十加几个一” 是完全一样的。只要你真正理解了位值原理,不管是八进制、十六进制还是六十进制,转换方法都是相通的。
    数学知识用起来!进制转换CSP入门级真题同款挑战 第2张
数学知识用起来!进制转换CSP入门级真题同款挑战 第3张

抱歉,评论功能暂时关闭!