到底代表什么
“十进制数 2127 代表什么?”
这或许是个很弱智的问题,但是 (2127)10 实际上表示:
这么写虽然看起来没什么卵用,但我想说明的是:第一个位置的 “2” 和第三个位置的 “2” 并不是一个 “2”,第一个表示的是 2000 ,即 2×103 ,而另一个表示的是 20 ,即 2×101 。
不同位置的 “2” 虽然都是 “2”,但是它们代表的 “大小“ 却并不相同。
我不清楚设计者为什么会创造这样的记数方式,但是这种方法确实可以有效地帮助我们理解其他进制的数,例如……
“二进制数 11010 代表多少?”
尽管很难一眼就看出这是多少,但是如果我们把它也转变为上面的写法,即:
这样或许就能更容易地理解这个二进制数到底是“多少”,而实际上这也是二进制数转化为十进制数的方法。
所谓 “进制” 就是 “进位的方法”。十进制是逢十进位,用 0~9 十个数字,二进制是逢二进一,用 0、1 两个数字。同样 N 进制就是逢 N 进一,用 0~N-1 共 N 个符号表示。
一个 N 进制数从右往左数第 m 个数 a 代表的 ”大小“ 就是
a×Nm−1 ,将各个位上的数所代表的 ”大小” 加起来就是这个数实际的 “大小” 。
关于短除法
那么十进制数如何转换为二进制数呢?
一种十分常见的方法是 “短除法”,即 “除二取余,商零为止,余数倒排”。
比如说,将 (26)10 转化为二进制数的过程为:
像上面这样,不断地除以 2,直到商为 0 为止,然后将得到的余数倒过来排列,就得到结果: (26)10=(11010)2
短除的原理
假设有一个二进制数 abcd,其中每个字母代表一个 0 或 1 。我们假设这个数等于十进制数 12 吧。那么我们要怎么计算 a、b、c、d 到底是 0 还是 1 呢?
按照第一节中数的意义,将 abcd 从二进制转换成十进制,那么会得到:
于是我们得到了一个等式:
不过这是个一元四次方程,似乎并不能得到唯一解……
但是实际上我们忽略了两个重要的约束条件:
- a、b、c、d 都是正整数。
- 它们不是 0 就是 1。
别小看这点条件,它们的作用可是顶得上两个等式的!
首先观察一下上述等式,我们发现,除了 d 之外,a、b、c 都有共同的系数 2,于是我们就可以对前三项进行因式分解:
我们将括号内的内容看成一个整体,就叫
k
吧,不难证明
而我们知道 d 不是 0 就是 1, k 又是正整数,那么这个式子不就等价于:
是吧?d 就是 12 除以 2 的余数,显然 d 就是 0 了!(因为 d 是 1 的话 k 就不可能是整数)那么 k 就是 6,即:
这个式子很熟悉是不是,除了最后一项,前几项都有公共系数 2,于是我们又可以按照前面的套路进行因式分解:
于是我们可以用与前面完全相同的方式处理,得到:
于是就得出 c 是 0, 2a+b 是 3 。
仔细看看,这不是就和短除法一模一样的过程吗?
没错,可以这样一直算到头,并且证明方法完全相同:
可得出 a 和 b,都是 1,而 c、d 都是 0,于是最终得到:
总结
所以说,短除法不过是简单的逆运算,因为有了正整数和大小的约束条件,即使只有一个等式,我们可以得出唯一的正确解。
不仅是十进制和二进制,其他进制,甚至是负进制。只要理解了通过因式分解可以将等式变成整数的带余数除法等式,再进行递归计算余下部分这一思路,剩下的只是加加减减上的不同。
有兴趣的同学可以试试 这道负进制转换的题,当时想了半天的说……(NOIP2000 D1T1 我竟然都做得这么费劲/(ㄒoㄒ)/~~)