SYQY网游福利站-新活动速递_热门攻略_礼包中心

到底代表什么

“十进制数 2127 代表什么?”

这或许是个很弱智的问题,但是

(2127)10

实际上表示:

2×103+1×102+2×101+7×100

这么写虽然看起来没什么卵用,但我想说明的是:第一个位置的 “2” 和第三个位置的 “2” 并不是一个 “2”,第一个表示的是

2000

,即

2×103

,而另一个表示的是

20

,即

2×101

不同位置的 “2” 虽然都是 “2”,但是它们代表的 “大小“ 却并不相同。

我不清楚设计者为什么会创造这样的记数方式,但是这种方法确实可以有效地帮助我们理解其他进制的数,例如……

“二进制数 11010 代表多少?”

尽管很难一眼就看出这是多少,但是如果我们把它也转变为上面的写法,即:

(11010)2===1×24+1×23+0×22+1×21+0×2016+8+2(26)10

这样或许就能更容易地理解这个二进制数到底是“多少”,而实际上这也是二进制数转化为十进制数的方法。

所谓 “进制” 就是 “进位的方法”。十进制是逢十进位,用 0~9 十个数字,二进制是逢二进一,用 0、1 两个数字。同样 N 进制就是逢 N 进一,用 0~N-1 共 N 个符号表示。

一个 N 进制数从右往左数第 m 个数

a

代表的 ”大小“ 就是 a×Nm−1,将各个位上的数所代表的 ”大小” 加起来就是这个数实际的 “大小” 。

关于短除法

那么十进制数如何转换为二进制数呢?

一种十分常见的方法是 “短除法”,即 “除二取余,商零为止,余数倒排”。

比如说,将

(26)10

转化为二进制数的过程为:

26÷2=13÷2=6÷2=3÷2=1÷2=13…06…13…01…10…1

像上面这样,不断地除以 2,直到商为 0 为止,然后将得到的余数倒过来排列,就得到结果:

(26)10=(11010)2

短除的原理

假设有一个二进制数 abcd,其中每个字母代表一个 0 或 1 。我们假设这个数等于十进制数 12 吧。那么我们要怎么计算 a、b、c、d 到底是 0 还是 1 呢?

按照第一节中数的意义,将 abcd 从二进制转换成十进制,那么会得到:

(abcd)2==a×23+b×22+c×21+d×20(12)10

于是我们得到了一个等式:

a×23+b×22+c×21+d×20=12

不过这是个一元四次方程,似乎并不能得到唯一解……

但是实际上我们忽略了两个重要的约束条件:

a、b、c、d 都是正整数。它们不是 0 就是 1。

别小看这点条件,它们的作用可是顶得上两个等式的!

首先观察一下上述等式,我们发现,除了 d 之外,a、b、c 都有共同的系数 2,于是我们就可以对前三项进行因式分解:

2×(22a+21b+c)+d=12

我们将括号内的内容看成一个整体,就叫

k

吧,不难证明 k 是个正整数,于是式子就简化成:

2k+d=12

而我们知道 d 不是 0 就是 1,

k

又是正整数,那么这个式子不就等价于:

12÷2=k…d

是吧?d 就是 12 除以 2 的余数,显然 d 就是 0 了!(因为 d 是 1 的话 k 就不可能是整数)那么 k 就是 6,即:

22a+21b+c=6

这个式子很熟悉是不是,除了最后一项,前几项都有公共系数 2,于是我们又可以按照前面的套路进行因式分解:

2(2a+b)+c=6

于是我们可以用与前面完全相同的方式处理,得到:

6÷2=(2a+b)…c

于是就得出 c 是 0,

2a+b

是 3 。

仔细看看,这不是就和短除法一模一样的过程吗?

没错,可以这样一直算到头,并且证明方法完全相同:

2a+b=3

可得出 a 和 b,都是 1,而 c、d 都是 0,于是最终得到:

(12)10=(1100)2

总结

所以说,短除法不过是简单的逆运算,因为有了正整数和大小的约束条件,即使只有一个等式,我们可以得出唯一的正确解。

不仅是十进制和二进制,其他进制,甚至是负进制。只要理解了通过因式分解可以将等式变成整数的带余数除法等式,再进行递归计算余下部分这一思路,剩下的只是加加减减上的不同。

有兴趣的同学可以试试 这道负进制转换的题,当时想了半天的说……(NOIP2000 D1T1 我竟然都做得这么费劲/(ㄒoㄒ)/~~)