1、第二讲 算法,一、算法的定义N.Wirth 认为:程序= 数据结构+算法 数据结构:用于描述数据的 算法:用于描述操作的,即解决怎么做 算法就是为解决一个问题而采取的方法和步骤。理论上讲,人们可以通过笔和纸按照描述的操作在有穷步内完成相应的运算。,例2-1 求的阶乘,计算5!=1*2*3*4*5 可以描述如下: Step1: 计算 1 * 2 = 2 Step2: 计算 2 * 3 = 6 Step3: 计算 6 * 4 = 24 Step4: 计算 24 * 5 = 120,问题:对于任意正整数 N,如何计算 N!,t = t*it = t*i .,t=t*i 但左t右t表示的 含义是不同的
2、,t = t,计算 N! 的算法,Step1: 输入正整数 N Step2: 1 t (被乘数) Step3: 1 i (乘数) Step4: t*i t (左t存储i-1的阶层,右t存储i-1的阶层) Step5: i+1 i Step6: if iN then goto Step7 else goto Step4 Step7: 输出 t 的值,并结束 其中,Step1 Step3 称为初始化,二、表示算法的三种基本结构,1966年,Bohra和Jacopini提出了程序中需要的三种控制结构,顺序结构,选择结构,循环结构,三种结构的共同点,只有一个入口 只有一个出口说明:菱形框是测试框,根据
3、测试的结果不同,可能有多个出口(一般是两个) 结构内的每一部分都有机会被执行到 结构内不存在“死循环”,三、算法的表示方法,流程图表示 流程图是用图框表示各种操作。图形标准由ANSI (American National Standard Institute) 制订,开始,输入/输出,开始和结束,条件判断,陈述语句,输入和输出,陈述性语句,条件判断,程序的流程线路,程序的注释,结束,连接点, N-S 图表示算法,背景:美国的 I.Nassi 和B.Shneiderman 于1973年提出了一种新的图示,用省去的带箭头流程线的框图表示算法。 基本图式如下:顺序、选择和两种循环结构。,用程序设计语
4、言表示算法,直接用程序表示或程序的一部分表示 用程序设计语言表示的算法,仍然只是算法描述,并没有实现算法。程序运行才是实现算法举例:例2-1的算法用程序设计语言表示,举例2-1 求5!,基本思路:把一个复杂问题的求解过程分阶段进行,每个阶段的处理过程都控制在人们容易理解和处理的范围内 基本策略:自顶向下,逐步求精,模块化设计,四、结构化程序设计,例如:写工厂的工作报告,自顶向下与逐步求精,例2-2 将11000之间的素数打印出来 (书中例2.22),“筛法”求素数表。方法:在一张纸上写上11000之间的全部整数,然后逐个判断它们是否素数,找出一个非素数,就把它挖掉,最后剩下的就是素数。,1 2
5、 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 ,具体的作法如下:素数的定义:只能被1和它本身整除的自然数 先将1挖掉(1不是素数) 用2去除它后面的各数,把能被2整除的数挖掉,即把2的倍数挖掉。 用3去除它后面的各数,即把3的倍数挖掉。 分别用4、5各数作为除数去除它后后面的各数。这个过程一直进行到除数后面的数已全被挖掉为止。,注:如果需要找1n内的素数,只需进行到除数为 (取其整数)即可。
6、,对任意正整数n,若存在一个大于 的整数能整除n,则必定存在一个小于 的整数能整除n。,算法表示为: 挖出1 用下一个 数i去除后面各数,把 i 的倍数挖掉,1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 ,1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 3
7、4 35 36 37 38 39 40 41 42 43 44 45 46 ,1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 ,1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 ,1
8、 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 ,检查i是否小于 的整数部分(若n=1000,则检查i31),如果是则返回 (2)继续执行,否则就结束。,未被挖去的,设计数据结构 变量xi=i,挖去1,关键在于 找到合适的除数xi 若除数xi已确定, 如何确定被除数?,数制转换,进位计数制 定义:在采用进位计数的数字系统中,如果只用r个基本符号(例如:0,1,2,r-1) 表示数值,则称为
9、基r数制,r称为该数制的“基数”,而数制中每一固定位置对应的单位值称为“权”。,r进制数N的加权表示方法N=an-1rn-1+ an-2rn-2+ + a1r1+ a0r0+ a-1r-1 + a-2r-2+ a-mr-m 如:在十进制中,678.34 可表示为 (678.34)D=6102+ 7101+ 8100+ 310-1 + 410-2 如:在八进制中,678.34 可表示为 (345.21)O=382+ 481+ 580+ 28-1 + 18-2,不同进制间的转换,R进制转换成十进制数 展开式: 本身就是转换方法,十进制数转换成r进制 整数部分的转换 十进制整数二进制采用除2取余法
10、例:求(66)10的等值二进制数。 (66)10=(Bn B1B0)2 = Bn2n + + B12 + B0 = (Bn2n-1 + + B1)2 + B0 两边除2取余,即得B0,商再除2取余,即得B1, .,余数,66,2,33,2,16,2,8,2,4,2,2,2,1,2,0, 0 (B0), 1 (B1), 0 (B2), 0 (B3), 0 (B4), 0 (B5), 1 (B6),(66)10 = (1000010)2,十进制 八进制:采用除8取余法。 十进制 十六进制:采用除16取余法。,小数部分的转换 十进制小数二进制:采用乘 2 取整法。例:求(0.8125)10的等值二进
11、制数。 (0.8125)10=(0.B-1 B-2 B-m)2= B-12-1 + B-22-2 + B-m2-m= (B-1 + B-2 2-1+ + B-m2-m+1)2-1 两边乘2取整得到B-1, 乘积的小数部分继续乘2取整得到B-2, ,0 . 8 1 2 5, 2,1 . 6 2 5 0 1 (B-1),0 . 6 2 5 0, 2,1 . 2 5 0 0 1 (B-2),0 . 2 5 0 0, 2,0 . 5 0 0 0 0 (B-3), 2,1 . 0 0 0 0 1 (B-4),(0.8125)D = (0.1101)2,整数,十进制小数八进制数:采用乘 8 取整的方法。
12、十进制小数十六进制数:采用乘 16 取整的方法。,原码、补码及反码,原码:将真值x的正、负号分别换成0、1,即得到x的原码 x原。 例如: x = +1001011, x原=01001011 x = -1100111, x原=11100111+0原= 00000000-0原 = 10000000,反码:正数的反码等于原码; 负数的反码等于其原码除符号位外,其余各位按位求反。 如:N1=1001001, N2=-1001001 N1反=01001001, N2反=10110110 +0反= 0000 -0反= 1111,字长为n位的整数的补码的定义为,补码的简便求法: 设真值 x = + x n
13、-2 x0,x补 = x n-1 x n-2 x0 当x0时,x补= 0 x n-2 x0 = x原 当x0时,x补 = 2n + x n个1= 111 - x n-2 x0 +1= 0 x n-2 x0 +1=|x|反+1,例 x1=1001011, x2=-1100111 x1补=x1原=01001011 x2原 = 11100111 x2补 = 10011000 + 1= 10011001 +0补=-0补=0000 (n个0),补码的性质及应用: x原 = x补补 如:已知x补= 10110110 ,求x。 则: x原 = x补补=10110110补= 00110110反+1 = 11001001+1=11001010 故:x = -1001010 x+y补= x补+ y补 如:x=(74)D= (1001010)B ,y=(-104)D=(-1101000)B 求x+y 则:x+y原=x+y补补=x补 + y补补=01001010 + 10011000补=11100010补=10011110 故:x + y = -11110 = (-30)D,