描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787115293688
如果数学不好,是否可以成为一名程序员呢?答案是肯定的。 《程序员的数学》适合:数学糟糕但又想学习编程的你
没有晦涩的公式,只有好玩的数学题。
帮你掌握编程所需的“数学思维”。
日文版已重印14次!
编程的基础是计算机科学,而计算机科学的基础是数学。因此,学习数学有助于巩固编程的基础,写出更健壮的程序。
本书面向程序员介绍了编程中常用的数学知识,借以培养初级程序员的数学思维。读者无需精通编程,也无需精通数学,只需具备四则运算和乘方等基础知识,就可以阅读本书。
书中讲解了二进制计数法、逻辑、余数、排列组合、递归、指数爆炸、不可解问题等许多与编程密切相关的数学方法,分析了哥尼斯堡七桥问题、少年高斯求和方法、汉诺塔、斐波那契数列等经典问题和算法。引导读者深入理解编程中的数学方法和思路。
本书还对程序员和计算机的分工进行了有益的探讨。读完此书,你会对以程序为媒介的人机合作有更深刻的理解。
目录
第1章 0的故事——无即是有
本章学习内容 2
小学一年级的回忆 2
10进制计数法 3
什么是10进制计数法 3
分解2503 3
2进制计数法 4
什么是2进制计数法 4
分解1100 5
基数转换 6
计算机中为什么采用2进制计数法 8
按位计数法 10
什么是按位计数法 10
不使用按位计数法的罗马数字 11
指数法则 12
10的0次方是什么 12
10-1是什么 13
规则的扩展 14
对20进行思考 14
2-1是什么 15
0所起的作用 16
0的作用:占位 16
0的作用:统一标准,简化规则 16
日常生活中的0 17
人类的极限和构造的发现 18
重温历史进程 18
为了超越人类的极限 19
本章小结 20
第2章 逻辑——真与假的二元世界
本章学习内容 22
为何逻辑如此重要 22
逻辑是消除歧义的工具 22
致对逻辑持否定意见的读者 23
乘车费用问题——兼顾完整性和排他性 23
车费规则 23
命题及其真假 24
有没有“遗漏” 24
有没有“重复” 25
画一根数轴辅助思考 26
注意边界值 28
兼顾完整性和排他性 28
使用if语句分解问题 28
逻辑的基本是两个分支 29
建立复杂命题 30
逻辑非——不是A 30
逻辑与——A并且B 32
逻辑或——A或者B 34
异或——A或者B(但不都满足) 37
相等——A和B等 39
蕴涵——若A则B 40
囊括所有了吗 45
德·摩根定律 46
德·摩根定律是什么 46
对偶性 47
卡诺图 48
二灯游戏 48
首先借助逻辑表达式进行思考 49
学习使用卡诺图 50
三灯游戏 52
包含未定义的逻辑 54
带条件的逻辑与(&&) 55
带条件的逻辑或(||) 57
三值逻辑中的否定(!) 58
三值逻辑的德?摩根定律 58
囊括所有了吗 59
本章小结 60
第3章 余数——周期性和分组
本章学习内容 64
星期数的思考题(1) 64
思考题(100天以后是星期几) 64
思考题答案 64
运用余数思考 65
余数的力量——将较大的数字除一次就能分组 65
星期数的思考题(2) 66
思考题(10100天以后是星期几) 66
提示:可以直接计算吗 67
思考题答案 67
发现规律 68
直观地把握规律 68
乘方的思考题 70
思考题(1234567987654321) 70
提示:通过试算找出规律 70
思考题答案 70
回顾:规律和余数的关系 71
通过黑白棋通信 71
思考题 71
提示 73
思考题答案 73
奇偶校验 73
奇偶校验位将数字分为两个集合 74
寻找恋人的思考题 74
思考题(寻找恋人) 74
提示:先试算较小的数 74
思考题答案 75
回顾 75
铺设草席的思考题 77
思考题(在房间里铺设草席) 77
提示:先计算一下草席数 77
思考题答案 78
回顾 78
一笔画的思考题 79
思考题(哥尼斯堡七桥问题) 79
提示:试算一下 80
提示:考虑简化一下 81
提示:考虑入口和出口 82
思考题答案 82
奇偶校验 85
本章小结 86
第4章 数学归纳法——如何征服无穷数列
本章学习内容 88
高斯求和 88
思考题(存钱罐里的钱) 88
思考一下 89
小高斯的解答 89
讨论一下小高斯的解答 89
归纳 91
数学归纳法——如何征服无穷数列 91
0以上的整数的断言 92
高斯的断言 93
什么是数学归纳法 93
试着征服无穷数列 94
用数学归纳法证明高斯的断言 95
求出奇数的和——数学归纳法实例 96
奇数的和 96
通过数学归纳法证明 97
图形化说明 98
黑白棋思考题——错误的数学归纳法 99
思考题(黑白棋子的颜色) 99
提示:不要为图所惑 100
思考题答案 100
编程和数学归纳法 101
通过循环表示数学归纳法 101
循环不变式 103
本章小结 107
第5章 排列组合——解决计数问题的方法
本章学习内容 110
计数——与整数的对应关系 110
何谓计数 110
注意“遗漏”和“重复” 111
植树问题——不要忘记0 111
植树问题思考题 111
加法法则 115
加法法则 115
乘法法则 117
乘法法则 117
置换 121
置换 121
归纳一下 122
思考题(扑克牌的摆法) 123
排列 125
排列 125
归纳一下 126
树形图——能够认清本质吗 128
组合 130
组合 130
归纳一下 131
置换、排列、组合的关系 132
思考题练习 134
重复组合 134
也要善于运用逻辑 136
本章小结 139
第6章 递归——自己定义自己
本章学习内容 142
汉诺塔 142
思考题(汉诺塔) 142
提示:先从小汉诺塔着手 143
思考题答案 146
求出解析式 148
解出汉诺塔的程序 149
找出递归结构 150
再谈阶乘 151
阶乘的递归定义 152
思考题(和的定义) 153
递归和归纳 153
斐波那契数列 154
思考题(不断繁殖的动物) 154
斐波那契数列 157
帕斯卡三角形 159
什么是帕斯卡三角形 159
递归定义组合数 162
组合的数学理论解释 163
递归图形 165
以递归形式画树 165
实际作图 166
谢尔平斯基三角形 167
本章小结 168
第7章 指数爆炸——如何解决复杂问题
本章学习内容 172
什么是指数爆炸 172
思考题(折纸问题) 172
指数爆炸 175
倍数游戏——指数爆炸引发的难题 176
程序的设置选项 176
不能认为是“有限的”就不假思索 178
二分法查找——利用指数爆炸进行查找 178
寻找犯人的思考题 178
提示:先思考人数较少的情况 179
思考题答案 180
找出递归结构以及递推公式 181
二分法查找和指数爆炸 183
对数——掌握指数爆炸的工具 184
什么是对数 184
对数和乘方的关系 184
以2为底的对数 186
以2为底的对数练习 186
对数图表 187
指数法则和对数 188
对数和计算尺 190
密码——利用指数爆炸加密 193
暴力破解法 193
字长和安全性的关系 193
如何处理指数爆炸 195
理解问题空间的大小 195
四种处理方法 195
本章小结 196
第8章 不可解问题——不可解的数、无法编写的程序
本章学习内容 200
反证法 200
什么是反证法 200
质数思考题 202
反证法的注意事项 203
可数 203
什么是可数 203
可数集合的例子 204
有没有不可数的集合 206
对角论证法 207
所有整数数列的集合是不可数的 207
所有实数的集合是不可数的 211
所有函数的集合也是不可数的 212
不可解问题 213
什么是不可解问题 213
存在不可解问题 214
思考题 215
停机问题 215
停机 216
处理程序的程序 217
什么是停机问题 217
停机问题的证明 219
写给尚未理解的读者 222
不可解问题有很多 223
本章小结 224
第9章 什么是程序员的数学——总结篇
本章学习内容 226
何为解决问题 229
认清模式,进行抽象化 229
由不擅长催生出的智慧 229
幻想法则 230
程序员的数学 231
大家好!我是结城浩。欢迎阅读《程序员的数学》。
本书是为程序员朋友们写的数学书。
编程的基础是计算机科学,而计算机科学的基础是数学。因此,学习数学有助于巩固编程的基础,写出健壮的程序。
有的读者可能会说“但我数学不好啊”。特别是很多读者“一碰到算式就跳过不读”。坦率而言,我自己遇到书中的算式也想跳过不看。
本书尽可能减少了“大家不想看的算式”,也没有过多的定义、定理和证明。这是为帮助程序员更容易理解编程而写的书。希望你能通过本书学到有助于编程的“数学思维”。
数学思维示例
学习“数学思维”说起来太抽象了,我们来举些具体的例子。
【条件分支和逻辑】
在编程时,我们按照条件将处理方法分为多个“分支”。C 语言和Java 语言中使用的是if 语句。处理方法为:
当满足条件时执行这条语句,不满足条件时执行另一语句。这时,我们就使用了数学领域的“逻辑”来控制程序。因此,编程时必须熟练掌握“
与”“、或”“、非”、“蕴涵”等逻辑构成元素。
【循环和数学归纳法】我们在处理大量的信息时,使用程序进行“循环”操作。比如使用for
语句可以循环处理大量数据。循环中使用的就是“数学归纳法”。
【分类和计数方法】
在将许多条件和数据“分类”时,程序员必须注意不能有遗漏。这时加法法则、乘法法则、排列、组合等“计数方法”将助你一臂之力。这是程序员应该熟记于心的数学工具。通过本书,也可以学到递归、指数、对数、余数等重要的基础思维方式。
人类和计算机的共同战线
我们写程序是为了解决人类解决不了的问题。程序员理解问题,编写程序;计算机运
行程序,解决问题。
人类不擅长重复劳动,很容易厌倦,有时还会出错,但人类擅长解决问题。与此相对,
计算机擅长重复劳动,但不能自行解决问题。
于是,人机合力,如虎添翼。
遇到难题,光靠人类不能解决,光靠计算机也不能解决。而人机合力就能解决问题。
这也是本书要传达的主旨之一。不过,编写程序也非易事,无论人类和计算机如何齐心合力,总有解决不了的问题。
本书也对人类和计算机的极限进行了分析。
希望你在读完本书后能对以程序为媒介的人机合作有更深刻的理解。
本书面向的读者
本书主要面向的读者是程序员。不过若你对编程或数学感兴趣,读起来也会一样有意思。你不需要精通数学。书中不会出现Σ和等很难的算式,因此自认为数学不太好的读者也完全可以阅读。阅读本书只需具备四则运算(+-
×÷)和乘方(23=2×2×2)等基础知识。除此以外的知识在书中皆有说明。如果你对数字和逻辑感兴趣,可能会更喜欢本书。
你也不需要精通编程。不过如果稍有一些编程经验,可能会更容易理解本书内容。书
中有个别例子是用C 语言写的程序,不过即使不懂C 语言也不妨碍理解。
本书结构
本书各章内容可以按任意顺序阅读,但笔者推荐从第1 章开始按顺序阅读。
第1 章对0 进行讨论。以按位计数法为核心,学习如何用0 来简化规则,并对“无即是有”的意义进行了思考。
vi
第2 章学习使用逻辑来整理繁琐的内容。介绍逻辑表达式、真值表、德?摩根定律、三值逻辑、卡诺图等。
第3 章讨论余数。我们要记住“余数就是分组”的观点。对于一些难题,有时只要找到周期性规律就能解决。
第4 章学习数学归纳法。数学归纳法只需要两个步骤就能证明无穷的断言。本章还会举例介绍使用循环不变式写出正确的循环。
第5 章学习排列组合等计数方法。计数的关键在于“认清对象的性质”。
第6 章学习自己定义自己的递归。通过汉诺塔、斐波那契数列、分形图形等,练习从复杂事物中发现递归结构。
第7
章学习指数爆炸。计算机也很难解决含有指数爆炸的问题。我们将在这里思考研究如何将指数爆炸为我所用,解决大型问题。另外本章还将以二分法检索为例,学习将问题空间一分为二的意义。
第8 章以停机问题为例,来说明许多程序上的问题是计算机如何发展都解决不了的。本章也会学到反证法和对角论证法。
第9 章回顾本书学习内容,思考人类全面把握结构的能力对解决问题有多大帮助,以及人机协作具有何种意义。
致谢
首先要感谢马丁?伽德纳。小时候我痴迷于阅读您所著的《数学游戏》,至今仍记忆犹新。此外,还要感谢支持我的广大读者和为我祈祷的基督教朋友们。
以下各位为本书提出了宝贵建议并给予了极大帮助,在此深表谢意(按日语五十音图顺序):天野胜、石井胜、岩泽正树、上原隆平、佐藤勇纪、武笠夏子、前原正英、三宅喜义。特别感谢在本书编写过程中给予我极大关怀和支持的SoftBank
出版有限公司的野泽喜美男主编。
感谢一直鼓励我的爱妻和两个儿子。
本书献给在餐桌上教我方程式乃至微积分的父亲。父亲,谢谢您!
2005 年2 月
结城 浩 __
CHAPTER1
第1章
0的故事
——无即是有
◎课前对话
老师:1,2,3的罗马计数法是I,II,III。学生:加法很简单嘛。I II,只要将3个I并排写就行了。老师:不过II III可不是IIIII,而是V喔!学生:啊,是这样啊!老师:没错,如果数目变大,那数起来可就费劲啦!
本章学习内容
本章将学习有关“0”的内容。
首先,介绍一下我们人类使用的10进制和计算机使用的2进制,再讲解按位计数法,一起来思考0所起的作用。乍一看,0仅仅是表示“什么都没有”的意思,而实际上它具有创建模式、简化并总结规则的重要作用。
小学一年级的回忆
以下是小学一年级时发生的事,我依然记忆犹新。“下面请打开本子,写一下‘十二’。”老师说道。于是,我翻开崭新的本子,紧握住削尖了的铅笔,写下了这样大大的数字。
老师走到我跟前,看到我的本子,面带微笑亲切地说:“写得不对喔。应该写成12喔。”
当时我是听到老师说“十二”,才写下了10和2。不过那样是不对的。众所周知,现在我们把“十二”写作12。
而在罗马数字中,“十二”写作XII。X表示10,I表示1。II则表示两个并排的1,即2。也就是说,XII是由X和II组成的。
如同“十二”可以写作12和XII,数字有着各种各样的计数法。12是阿拉伯数字的计数法,而XII是罗马数字的计数法。无论采用哪种计数法,所表达的“数字本身”并无二致。下面我们就来介绍几种计数法。
10进制计数法
下面介绍10进制计数法。
什么是10进制计数法
我们平时使用的是10进制计数法。
使用的数字有0、1、2、3、4、5、6、7、8、9共10种a。
数位有一定的意义,从右往左分别表示个位、十位、百位、千位……
以上规则在小学数学中都学到过,日常生活中也一直在用,是众所周知的常识。在此权当复习,后面我们将通过实例来了解一下10进制计数法。
分解2503
首先,我们以2503这个数为例。2503表示的是由2、5、0、3这4个数字组成的一个称作2503的数。
这样并排的数字,因数位不同而意义相异。
2表示“1000的个数”。
5表示“100的个数”。
0表示“10的个数”。
3表示“1的个数”。
a 这里的“种”指的是数字的种类,用来说明10进制和2进制中数字复杂程度的差异。如2561中包含四种数字,而1010中只包含两种数字。——译者注
综上所述,2503这个数是2个1000、5个100、0个10和3个1累加的结果。用数字和语言来冗长地说明有些无趣,下面就用图示来表现。
2×1000 5×100 0×10 3×1
如图,将数字的字体大小加以区别,各个数位上的数字2、5、0、3的意义便显而易见了。1000是10×10×10,即10(310的3次方),(10的2次方)
100是10×10,即102。因此,也可以写成如下形式(请注意箭头所示部分)。
2×103
5×102
0×10 3×1
再则,10是101(10的1次方),1是100(10的0次方),所以还可以写成如下形式。
2×103 5×102 0×101
3×100
千位、百位、十位、个位,分别可称作103的位、102的位、101的位、100的位。10进制计数法的数位全都是10n的形式。这个10称作10进制计数法的基数或底。基数10右上角的数字——指数,是3、2、1、0这样有规律地顺次排列的,这点请记住。
3210
2×103 5×102 0×101 3×100
2进制计数法
下面讲解2进制计数法。
什么是2进制计数法
计算机在处理数据时使用的是2进制计数法。从10进制计数法类推,便可很快掌握它的规则。
??使用的数字只有0、1,共2种。
??从右往左分别表示1位、2位、4位、8位……
用2进制计数法来数数,首先是0,然后是1,接下去……不是2,而是在1上面进位变成10,继而是11,100,101……
表1-1展示了0到99的数的10进制计数法和2进制计数法。
0到99的数的10进制计数法和2进制计数法
分解1100
在此,我们以2进制表示的1100(2进制数的1100)为例来探其究竟。
和10进制计数法一样,并排的数字,各个数位都有不同的意义。从左往右依次为:
1表示“8的个数”。
1表示“4的个数”。
0表示“2的个数”。
0表示“1的个数”。
也就是说,2进制的1100是1个8、1个4、0个2和0个1累加的结果。这里出现的8、4、2、1,分别表示23、22、21、20。即2进制计数法的1100,表示如下意思。
3210
1×23 1×22 0×21 0×20
如此计算就能将2进制计数法的1100转换为10进制计数法。
31×22 0×21 0×20
1×2 1×8 1×4 0×2 0×18 4 0 012
由此可以得出,2进制的1100若用10进制计数法来表示,则为12。
基数转换
接下来我们试着将10进制的12转换为2进制。这需要将12反复地除以2(12除以2,商为6;6再除以2,商为3;3再除以2……),并观察余数为“1”还是“0”。余数为0则表示“除完了”。随后再将每步所得的余数的列(1和0的列)逆向排列,由此就得到2进制表示了。
用2进制表示12
同样地,我们试将10进制的2503转换为2进制计数法。
我们从图1-2可以知道2503用2进制表示为100111000111。各个数位的权重如下:
1×211 0×210 0×29 1×28 1×27 1×26 0×25 0×24 0×23 1×22 1×21 1×20
在10进制中,基数为10,各个数位是以10n的形式表现的。而2进制中,基数为2,各个数位是以2n的形式表现的。从10进制计数法转换为2进制计数法,称作10进制至2进制的基数转换。
计算机中为什么采用2进制计数法
计算机中一般采用2进制计数法,我们来思考一下原因。计算机在表示数的时候,会使用以下两种状态。
开关切断状态
开关连通状态
虽说是开关,但实际上并不需要机械部件,你可以想象成是由电路形成的“电子开关”。总之,它能够形成两种状态。这两种状态,分别对应0和1这两个数字。
… 0
… 1
1个开关可以用0或1来表示,如果有许多开关,就可以表示为许多个0或1。你可以
想象这里排列着许多开关,各个开关分别表示2进制中的各个数位。这样一来,只要增加
开关的个数,不管是多大的数字都能表示出来。
当然,做成能够表示0~9这10种状态的开关,进而让计算机采用10进制计数法,
这在理论上也是可能的。但是,与0和1的开关相比,必定有更为复杂的结构。另外,请比较一下图1-3和图1-4所示的加法表。2进制的表比10进制的表简单得多吧。
若要做成1位加法的电路,采用2进制要比10进制更为简便。
不过,比起10进制,2进制的位数会增加许多,这是它的缺点。例如,在10进制中
2503只有4位,而在2进制中要表达同样的数则需要100111000111共12位数字。这点从
表1-2中也显而易见。
人们觉得10进制比2进制更容易处理,是因为10进制计数法的位数少,计算起来不
容易发生错误。此外,比起2进制,采用10进制能够简单地通过直觉判断出数值的大小。
人的两手加起来共有10个指头,这也是10进制更容易理解的原因之一。
10进制的加法表
2进制的加法表
不过,因为计算机的计算速度非常快,位数再多也没有关系。而且计算机不会像人类那样发生计算错误,不需要靠直觉把握数字的大小。对于计算机来说,处理的数字种类少、计算规则简单就最好不过了。
让我们来总结一下。
10进制计数法中,位数少,但是数字的种类多。
→对人类来说,这种比较易用。
2进制计数法中,数字的种类少,但是位数多。
→对计算机来说,这种比较易用。
鉴于上述原因,计算机采用了2进制计数法。
人类使用10进制计数法,而计算机使用2进制计数法,因此计算机在执行人类发出的任务时,会进行10进制和2进制间的转换。计算机先将10进制转换为2进制,用2进制进行计算,再将所得的2进制计算结果转换为10进制。
人类使用计算机进行计算的情形
转换为2进制
转换为10进制
10101 10011
使用2进制进行计算
101000
按位计数法
下面来介绍按位计数法。
什么是按位计数法
我们学习了10进制和2进制两种计数法,这些方法一般称作按位计数法。除了10进制和2进制以外,还有许多种类的按位计数法。在编程中,也常常使用8进制和16进制计数法。
●8进制计数法
8进制计数法的特征如下:
使用的数字有0、1、2、3、4、5、6、7共8种。
80的位、81的位、82的位、83的位……(基数是8)
21 19
40
●16进制计数法
16进制计数法的特征如下:
使用的数字有0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F共16种。
160的位、161的位、162的位、163的位……(基数是16)
在16进制计数法中,使用A、B、C、D、E、F(有时也使用小写字母a、b、c、d、e、
f)来表示10以上的数字。
●N进制计数法
一般来说,N进制计数法的特征如下:
使用的数字有0,1,2,3,…,N-1,共N种。
N0的位、N1的位、N2的位、N3的位……(基数是N)
例如,N进制计数法中,4位数a3a2a1a0为
a3×N3 a2×N2 a1×N1 a0×N0(a3、a2、a1、a0是0~N-1中的数字。)
不使用按位计数法的罗马数字
按位计数法在生活中最为常见,因此人们往往认为这种方法是理所当然的。实际上,
在我们身边也有不使用按位计数法的例子。例如,罗马计数法。罗马数字至今还常常出现在钟表表盘上。
使用罗马数字的钟表表盘
还有,在电影最后放映的演职员名单中,也会出现表示年号的MCMXCVIII等字母。这也是罗马数字。罗马计数法的特征如下:
数位没有意义,只表示数字本身
0
使用I(1)、V(5)、X(10)、L(50)、C(100)、D(500)、M(1000)来记数
将并排的数字加起来,就是所表示的数。
例如,3个并排的I(III)表示3,并排的V和I(VI)表示6,VIII表示8。罗马数字的加法很简单,只要将罗马数字并排写就可以得到它们的和。比如,要计算1 2,只要将表示1的I和表示2的II并排写作III就行了。但是,数字多了可就不太简单了。
例如,计算3 3并不是把III和III并排写作IIIIII,而是将5单独拿出来写作V,所以6就应该写作VI。CXXIII(123)和LXXVIII(78)的加法,也不能仅仅并排写作CXXIIILXXVIII,而必须将IIIII转换为V,VV转换为X,XXXXX转换为L,再将LL转换为C,如此整理最后得到CCI(201)。在“整理”罗马数字的过程中,必须进行与按位计数法的进位相仿的计算。
罗马计数法中还有“减法规则”。例如IV,在V的左侧写I,表示5-1,即4(在钟表表盘上,由于历史原因也有将4写作IIII的)。让我们试着将罗马数字的MCMXCVIII用10进制来表示。
MCMXCVIII=(M) (CM) (XC) (V) (III)=(1000) (1000-100) (1000-10) (5) (3)=1998
可以发现,MCMXCVIII表示的就是1998。罗马数字真是费劲啊!
指数法则
10的0次方是什么
在10进制的说明中,我们讲过“1是100(10的0次方)”,即100=1。
也许有些读者会产生以下疑问吧。
102是“2个10相乘”,那么100不就是“0个10相乘”吗?这样的话,不应该是1,而是0吧?
这个问题的核心在哪里呢?我们来深入思考一下。问题在于“10n是n个10相乘”这部分。在说“n个10相乘”时,我们自然而然会把n想作1,2,3…。因此,在说“0个10相乘”时,却不知道应该如何正确理解它的意义。
那么,暂且抛却“n个10相乘”这样的定义方式吧。我们从目前掌握的知识来类推,看看如何定义100比较妥当。
众所周知,103是1000,102是100,101是10。
将这些等式放在一起,寻找它们的规律。
103=1000102=100101=10100=?
1??101??101??10
每当10右上角的数字(指数)减1,数就变为原先的10分之1。因此,100就是1。综上所述,在定义10n(n包括0)的值时可以遵循以下规则:
指数每减1,数字就变为原来的10分之1。
10-1是什么
不要将思维止步于100之处。对于10-1(10的-1次方),让我们同样套用这一规则(指数每减1,数字就变为原来的10分之1)。
100˙11
10_1˙
10110_2˙
100110_3˙1000
…
1??101??101??10
规则的扩展
首先让我们做一个小结。我们学习了10n计数法的相关内容。起初,我们把n为1,2,3…时,即101,102,103…想作“1个10相乘”、“2个10相
乘”、“3个10相乘”……然后,我们抛却了“n个10相乘”的思维,寻找到了一个扩展规则:对于10n,n每减1,就变成原来的10分之1。
当n为0时,若套用“10n为n个10相乘”的规则,着实比较费解。于是我们转而求助于“n每减1,就变成原来的10分之1”的规则”,定义出100是1(因为101的10分之1就是1)。
同样地,10-1,10-2,10-3…的值(即n为-1,-2,-3…时),也适用于这个扩展规则。
如此,对于所有的整数n(…,-3,-2,-1,0,1,2,3,…),都能定义10n的值。对于10-3来说,“-3个10相乘”的思维并不直观。但倘若套用扩展规则,即使n是负数,也能“定义出”10的n次方的值。
对20进行思考
让我们用思考100的方法,也思考一下20的值吧。
25˙32
24
˙16
23
˙8
22
˙4
21
˙2
20
˙?
由此可知,对于2n来说,n每减1,数值就变成原来的2分之1。21的2分之1是20,那么20=1。在这里我想强调的是,不要将20的值作为一种知识去记忆,我们更需要考虑的是,如
何对20进行适当的定义,以期让规则变得更简单。这不是记忆力的问题,而是想象力的问题。请记住这种思维方式:以简化规则为目标去定义值。
1??21??21??21??21??2
2-1是什么
让我们参照10-1的规则来思考2-1。20除以2,得到的是2-1,即2-1=12。
“2的-1次方”在直觉上较难理解。鉴于规则的简单化和一致性,2的-1次方可以定
义为2-1=21。同理,2-2=212,2-3=213。
综上所述,可以总结出如下等式:
10 5=1×10×10×10×10×1010 4=1×10×10×10×1010 3=1×10×10×1010 2=1×10×1010 1=1×10100=110-1=1÷1010-2=1÷10÷1010-3=1÷10÷10÷1010-4=1÷10÷10÷10÷1010-5=1÷10÷10÷10÷10÷10
2 5=1×2×2×2×2×22 4=1×2×2×2×22 3=1×2×2×22 2=1×2×22 1=1×2
20
=12-1=1÷22-2=1÷2÷22-3=1÷2÷2÷22-4=1÷2÷2÷2÷22-5=1÷2÷2÷2÷2÷2
看了上面的等式之后,你应该就更能体会100和20为什么都等于1了吧。
到这里,我们给之前所说的“规则”取名为“指数法则”。指数法则的表达式为
=Na b
Na×Nb
即“N的a次方乘以N的b次方,等于N的a b次方”法则(但N≠0)。有关指数
法则的内容,在第7章也会谈到。
0所起的作用
0的作用:占位
这节我们来讨论0的作用。例如,用10进制表示的2503,它当中的0起到了什么作用呢?2503的0,表示十位“没有”。虽说“没有”,但这个0却不能省略。因为如果省略了0,写成253,那就变成另一个数了。
在按位计数法中,数位具有很重要的意义。即使十位的数“没有”,也不能不写数字。这时就轮到0出场了,即0的作用就是占位。换言之,0占着一个位置以保证数位高于它的数字不会产生错位。
正因为有了表示“没有”的0,数值才能正确地表现出来。可以说在按位计数法中0是不可或缺的。
0的作用:统一标准,简化规则
在按位计数法的讲解中,我们提到了“0次方”,还将1特意表示成100。使用0,能够将按位计数法的各个数位所对应的大小统一表示成
10n
否则,就必须特别处理“1”这个数字。0在这里起到了标准化的作用。
如果从高到低各个数位的数字依次为an,an-1,an-2,…,a2,a1,a0,那么10进制的按位计数法就能用以下表达式来表示:
_
a2×102
_
a1×101
_
a0×100
按位计数法的各个数位也能统一写作
ak×10k
请注意:ak右下角的k和10k的指数k是一致的。在上述表达式中,设n=3,a3=2,a2=5,a1=0,a0=3,最后的结果是2503。
通过0来明示“没有”,能够使规则简单化。在许多情况下,规则是越简单越好的。当你在面对问题的时候,是否也可以借助0来使问题简单化呢?请想一想吧。
日常生活中的0
在我们的日常生活中,有时也会遇到像0那样表示“没有”的情况。
●没有计划的计划
我们常常使用日程表来管理计划。在日程表中填入“案头工作”、“出差”、“研讨会”
等计划。那么,和“0”相当的计划是什么呢?
例如,我们可以将没有计划的状况设定成“空计划”。通过在计算机的日程表中搜索“空计划”,就能找到没有计划的日期。这样一来,我们就既能搜索已有的计划,又能搜索“空计划”了。
还有,我们也可以将“预计不安排计划(即,将该时间空出来)”当作0来考虑。在日
程表中先将“预计不安排计划”的日程填写占位,然后再填写需要安排工作的日程。这样
就不至于引起混乱。这正好与按位计数法中的0起到的占位作用相似。
●没有药效的药
假设现在必须有规律地服用一种胶囊,每4天停用1次。也就是3天服用,1天停用,3天服用,1天停用,按照这种周期循环服药,有难度吧?灵机一动,妙法自然来。那就每天都吃药吧。只是,每4粒中有1粒是“没有药效”的假胶囊。事先准备好标有日期的盒子,并在其中放入每天需要服用的药,不是更好吗?
事先将“假胶囊”放入标有日期的盒子里
=胶囊=假胶囊
这样一来,就无需判断“今天是服药日还是停药日”了。正因为有了“没有”药效的药,
才形成了“每天服用1粒胶囊”的简单规则。a
由此可见,这时的假胶囊与按位计数法中“0”所起的作用相同。
评论
还没有评论。