这篇文章是《程序员的数学》的读书笔记。0计数就是简单的计数,计数就是一种计数的方法。严格来说,是一个事物与被统计事物的一一对应关系。只要没有遗漏和重复,这个数字就是准确的。很小的时候,我们常常用手指头数数,从1数到10,然后就糊涂了。如果我们更聪明,我们会加上脚趾。不够怎么办?这也是困扰我们老祖宗的一个问题,手指不够用,可以用其他更多的东西,比如石头,石头总是比手指多,但是如果石头多了怎么办?于是发明了伟大的十进制。我们日常使用的数字1、2、3、999、10000等其实都是十进制,只是一般不这么叫,跟二进制、八进制等放在一起就说明了。十进制是每10进1,每10的数满位就进1到高位,用0到9的十个数,从右到左分别代表个、十、百、千。..每个位置的数字代表该位有多少个值。总数就是把每一位的值乘以本位的个数,最后相加。例如2503表示21000,5100,010,31累加结果,即2503=21000+5100+010+31,1000,100,10,1可以用10^3(10的三次方),10^2,10^1,10分别用^0来表示,所以十进制的位数都是10^n的形式,n从右到左分别是0,1,2,3,4...,10称为底数或基数,n称为指数。了解了十进制的记法之后,二进制的记法也很简单。计算机使用二进制表示法。计算机之所以采用二进制表示法,是因为二进制表示法的数较少,计算机结构可以更简单,也更容易表达,比如电路的断线等。二进制只用0和1两个数,从右到左分别代表1位、2位、4位、8位……比如1100代表18、14、02、0的结果1的累加就是对应的十进制数12,而8、4、2、1这几个数位分别可以用2^3、2^2、2^1、2^0来表示,那么二进制的数位他们都是2^n的形式,n从右到左分别是0、1、2、3、4....以上两种计数方式也称为按位计数方式。此外,常用的还有八进制和十六进制。八进制使用0-7的八个数字,从右到左的数字分别是8^0、8^1....十六进制比较特殊,因为数字只有0-9,不够16,怎么办,补充字母:A,B,C,D,E,F,A代表10,B代表11...F代表16,从右到左的数字分别是16^0、16^1...,常用的颜色值#FFFFFF、#F5F5F5等都是十六进制。不同的计数方法可以相互转换。上面说了,二进制转十进制就是把十进制数连续除以2,观察每次除后的余数是1还是0,然后把剩下的继续除以2,最后把余数排列在reverse得到对应的二进制,比较抽象,看例子:比如1212/2=6,余数06/2=3,余数03/2=1,余数11/2=0,1的余数倒序排列:1100如9999/2=49,149/2=24,124/2=12,012/2=6,06/2=3,03/2=1,余数11/2=0,余数1倒序排列:1100011不是很简单。前面几位的表示都是指数的形式,指数的大概情况比较好理解。例如,10^2是两个10的乘积,10^3是三个10的乘积。10^0呢,010相乘,不应该是0,其实是1,所以需要换个方式来理解。不知道的时候,可以先写一些,然后,找规律,可以先忽略0的大小写。10^3=1000,10^2=100,10^1=10,10^0=?5^3=125,5^2=25,5^1=5,5^0=?2^3=8.2^2=4,2^1=2,2^0=?你发现规律了吗?其实就是k^n。当n减1时,数值变成原来的k分之一,所以10^0是10^1的十分之一,也就是1,5^0是5^1的五分之一,也就是1,2^0是2^1的二分之一,也是1,所以k^0=1。这样就很容易理解k^-n。比如10^-1是10^0的十分之一,也就是1/10,10^-1是10^-1的十分之一,也就是1/100。以前我们总是刻意记得比如10^0和2^0是1,负次方是分数,但其实我们应该记住这组规则,这样我们才能举一反三。看到这里,你可能会疑惑为什么标题是0,其实上面的基础都是0,如果没有0,就没有按位计数的方法,0起到了占位符的作用。索引中0的作用是统一标准,简化规则。否则数字1要特殊对待,不能用10^n或2^n来表示。余数余数就是除法运算后剩下的数,也叫余数,开玩笑的。余数非常有用,它可以帮助处理周期性问题,即使值很大,但可以通过余数来简化问题,可以将数值大的问题转化为数值小的问题;余数也用来分组,比如表格中常见的Interlacedcolorchangingfunction,通过给n%2=0的行添加颜色,可以将偶数行和奇数行分成两组。来看一个经典的问题,今天是星期天,一百天后是星期几?100天的价值不大,直接算也能算出来,但是如果1000、10000天之后,或者10^100天之后呢?人多不说,电脑都会死机。这个问题可以通过余数轻松解决。一周有7天,所以100天内能补上7天的可以忽略,所以100%7=2,还有2天。今天是星期天,所以两天后就是星期二。因为10^100的数值太大,计算机计算起来很费力,不妨先看看能不能找到规律。10^0=11%7=1星期一10^1=1010%7=3星期三10^2=100100%7=2星期二10^3=10001000%7=6星期六.....如果有兴趣的可以继续写,最后你会发现随着n的指数增加,余数定律是6个数的循环,1,3,2,6,4,5,n从0到100,所以总数是101,所以101%6=5,第五个对应的数是4,所以10^100天后就是星期四。数学归纳法数学归纳法是用来证明关于整数的陈述对于所有0以上的整数(0、1、2、3……)是否成立的方法。综上所述,乍听不靠谱,其实非常严谨。数学归纳法的证明步骤类似于多米诺骨牌。首先要保证每张牌都被翻下时下一张会倒下,然后要保证第一张牌能被推下,这样整张多米诺骨牌才能倒下。假设要证明一个断言P(n)对于所有大于0的整数n都为真,那么使用数学归纳法的步骤如下:1.证明当n=0时,P(0)为真2.证明即无论n为0以上哪一个整数,P(n)成立,则P(n+1)也成立。步骤1称为基础,步骤2称为归纳。经过以上两步,就可以证明断言是真的了。我们来看一道大家之前做过的题:1到100的和是多少?最基本的方法当然是从1到100一路相加,但是相信大家也知道还有一种方法,就是101*50=5050,也就是首尾相加:1+100=101,2+99=101,3+98=101.....已经加到50+51=101,一共是50101,那么和就是5050。现在假设是从0加到n,但是就是仍然认为是从1加到n,那么每一项的首尾之和为1+n,一共有n/2项,和为:(1+n)(n/2)=((1+n)n)/2,这个表达式也叫高斯方程,我们记为A(n),然后用数学归纳法证明A(n)对于所有n为0或0以上的所有整数为真,步骤如下:1.证明A(0)为真。2、证明无论n是0以上的任意整数,如果A(n)为真,则A(n+1)也为真。第一步:代入0表示公式的值为0,从0加0也为0,成立。第二步:假设A(n)成立:即0+1+2+...+n=((1+n)*n)/2成立证明A(n+1)成立:将n+1添加到A(n)的两边:0+1+2+....+n+(n+1)=((n+1)*n)/2+(n+1)代入A(n)的右边到这个等式的左边:((1+n)*n)/2+(n+1)=((n+1)*n)/2+(n+1)右边合并:((1+n)*n)/2+(n+1)=(n^2+3n+2)/2左边展开合并:(n^2+3n+2)/2=(n^2+3n+2)/2左右边相同,所以A(n+1)也成立步骤1和步骤2都成立,所以从0到n的和=((1+n)*n)/2成立。PermutationCombinationPermutation将n个事物按顺序排列称为排列。例如,ABC的三张牌有多少种排列方式?第一张牌有三个选项,第二张牌有两个选项,第三张牌只有一个选项。因为每个选项都可以和其他选项不同,所以一般的安排是把这几次的选项数相乘,321=6。如果有四张ABCD牌,则有4321=24的排列,更多的数相近。这种乘法很有规律,逐渐递减。这称为阶乘,用!表示。例如321表示为3!,4321表示为4!。排列从n个事物中选出m(m<=n)个事物来替换它们,称为排列。例如,从5张牌中选择3张进行替换:第一张牌有5个选项,第二张牌有4个选项,第三张牌有3个选项。总排列:543=60种。抽象,从n张牌中取出k张牌排列:n*(n-1)*(n-2)*....*(n-k+1)将上式统一为减法形式:(n-0)*(n-1)*(n-2)*....*(n-(k-1)),从0乘以k-1,则一共k项相乘排列了total记为:因为这个公式不好写,所以用下面的:Pk(上)n(下)来表示。上面的表达式写起来太长,可以用阶乘的形式表示:因为n!=(n-0)*(n-1)*(n-2)*...*(n-(k-1))*(n-k)*...*2*1(n-k)*...*2*1=(n-k)!所以Pk(上)n(下)=n!/((n-k)!)。组合从n个不同的元素中取出k(k<=n)个元素,不分顺序排列的方法就是组合。Ck(Up)n(Down),计算方法是先计算排列总数:Pk(Up)n(Down),然后除以重复度。比如4和3的总排列数:432=24,但是取出来的三个元素有321=6的排列方式,所以每三个元素重复6次,需要去掉这个重复,24/6=4种。这个重复性正好是k的排列数,所以:ck(top)n(bottom)=(从n个不同元素中取出的k(k<=n)个元素的排列总数)/(k的排列总数)=(n!/((n-k)!))/k!=n!/((n-k)!k!)来练习一下:把King、King、J、Q、K这五张牌排成一排,找到有几种排列方式,其中至少左边和右边的一张ends是一张A,没有大小王之分。分为三种情况:1、左端为王牌的情况。王牌有两种选择,其余四张牌替换。总数计算如下:2*P(4/4)=2*4*3*2*1=48。2、右端如上是王牌,483,两端是王牌两端的选择,两张王牌的替换P(2/2)*剩余3张牌的替换P(3/3)=2!*3!=2*1*3*2*1=12。1和2这两种情况包含了3的情况,所以区分大小王的排列总数=1的总数+2的总数-3的总数,再计算不区分大小王的情况大小王,除以王牌重复度P(2/2)=2*1=2,最终总排列为:(48+48-12)/2=42种。本文对计数、余数、数学归纳法和排列组合的相关知识进行了简单的论述。下一篇文章会讨论一个有趣的东西:递归,敬请期待。
