《Python复习题-.pdf》由会员分享,可在线阅读,更多相关《Python复习题-.pdf(44页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、Python 复习题Python 语法基础小结(2010-09-08)1 python 的基础数据类型类型类型名例子整数int 1,-5,0 xab 实数float 2.3,7.8E10 字符串str“abcd”,你好?逻辑bool True False 2 运算符+加法,字符串联接,数组融合-减法*乘法,字符串级联/实数除法/整除%求余数*求幂in判断元素是否在序列类型中forx in序列类型:序列类型遍历and并且or或者not不是比较运算符:=!=赋值语句=+=-=*=/=%=3 if 语句格式一if 条件:如果条件成立执行本段代码else:如果条件不成立执行本段代码格式二if 条件:如
2、果条件成立执行本段代码格式三if 条件 1:如果条件1 成立执行本段代码elif 条件 2:如果条件2 成立执行本段代码elif 条件 3:如果条件3 成立执行本段代码else:如果以上条件都不成立执行本段代码4 for 循环for i in 序列类型:对于序列类型的每一个元素执行本段代码例一:求数组元素平均的程序#coding=gbk#求数组元素的平均值x=1,2,3,4.6,7.1 s=0 for i in x:s=s+i a=s/len(x)print(x=,x)print(共,len(x),个元素)print(总和=,s)print(平均值=,a)x=1,2,3,4.6,7.1 共 5
3、 个元素总和=17.7 平均值=3.54例 2:求 1+2+3+.+100=?#coding=gbk#求 1+2+3+.+100=?s=0 for i in range(1,100+1):s=s+i print(1+2+3+.+100=,s)1+2+3+.+100=5050例 3:求 1+3+5+7.+99=?#coding=gbk#求 1+3+5+7+.+99=?s=0 for i in range(1,99+1,2):s=s+i print(1+3+5+7+.+99=,s)1+3+5+7+.+99=2500range(1,100,2)的意思是:1,3,5,7,.99 从 1 开始,到 10
4、0 结束,但不包含 100,每次增加2range(1,101)的意思是:1,2,3,.99,100 从 1 开始,到 101 结束,但不包含 101,每次增加1例 4:求 10+9+8+7+.+1=?#coding=gbk#求 10+9+8+7+,+1=?s=0 for i in range(10,0,-1):s=s+i print(10+9+8+7+.+1=,s)10+9+8+7+.+1=55例 5:求数组 10,8,-1,100,200,35的最大元素-方法一#coding=gbk#求数组 10,8,-1,100,200,35 的最大元素x=10,8,-1,100,200,35 mx=x0
5、 for i in range(0,len(x):if mx xi:mx=xi print(x=,x)print(最大元素=,mx)x=10,8,-1,100,200,35 最大元素=200例 6:求数组 10,8,-1,100,200,35的最大元素-方法二#coding=gbk#求数组 10,8,-1,100,200,35 的最大元素x=10,8,-1,100,200,35 mx=x0 for y in x:if mx y:mx=y print(x=,x)print(最大元素=,mx)x=10,8,-1,100,200,35 最大元素=200range(10,0,-1)的意思是:10,9,
6、8,7,6,1 从 10 开始,到0 结束,但不包含 0,每次增加-15 while 循环格式:while 条件:当条件成立时,一直执行本段如果条件成立,一直执行后面的“语句块”,这意味着,您需要在(循环体的)语句块中于适当的时候改变条件表达式中的某个(或某些)变量,或者使用break 中止循环。while 与 if 的不同是:if 条件:如果条件成立,执行一次本段代码而 while 则是,一直重复执行那段代码,直到,条件不满足时为止。场景一场景二狄仁杰说道:我只问你一个问题,说了就放你走。山无陵,天地合,乃敢与君绝!if 说了:就放你走while not(山无陵,天地合):与君一直在一起例
7、1:求数组 10,8,-1,100,200,35的最大元素-方法三#coding=gbk#求数组 10,8,-1,100,200,35 的最大值x=10,8,-1,100,200,35 mx=x0 i=0 while i len(x):if mx=0:if mx xi:mx=xi i=i-1 print(x=,x)print(最大元素=,mx)x=10,8,-1,100,200,35 最大元素=200死循环的用法例 3:求数组 10,8,-1,100,200,35的最大元素-方法五#coding=gbk#求数组 10,8,-1,100,200,35 的最大值x=10,8,-1,100,200,
8、35 mx=x0 i=len(x)-1 while True:if mx xi:mx=xi i=i-1 if i=0 的自然数返回值:n!f=1 for i in range(1,n+1):f=f*i return f print(5!=,fact(5)5!=120 在 fact 函数中:n 是形式数,f,i 是函数fact 的局部变量,return f 是函数的 返回值,5 是调用函数fact 的实际参数。函数的文档2.3 函数的形式参数与实际参数让我们看下面的例子:#coding=gbk def test(x1,x2):#x1,x2 是形式参数 x1=x1*x1 x2=x2*x2 y =x
9、1+x2#y是局部变量 return y a1=2 a2=3 b =test(a1,a2)#a1,a2 是实际参数print(a1,a2=,a1,a2)print(b=,b)a1,a2=2 3 b=13在这个例子中:函数test 有两个形式参数:x1和x2。变量a1和a2是函数的实际参数。调用 test(a1,a2)时,把实际参数 a1、a2的值分别传递给形式参数x1、x2,虽然形式参数 x1,x2的值在函数内部被改变了,而实际参数a1,a2 没有被改变。2.4 序列类型之 元组(tuple)将几个量用逗号隔开,用一对园括号括起来,就形成一个元组。例如:(1,2,“abc”)用途:x,y,z=
10、(1,2,3)#这一句叫作元组的解包。执行该语句后,x=1;y=2;z=3。实际应用中,在不产生二义性的时候,可以省略园括号。例如:name,sex,age=“张三”,“男”,58 虽然形式参数x1,x2的值在函数内部被改变 了,而 实 际 参 数a1,a2 没有被改变。2.5 元组作为函数的返回值当我们需要从函数中返回多个值时,可以使用元组作为返回值。#coding=gbk#求序列类型的最大元素和最小元素#入口 :v 序列类型#返回 :(最大元素,最小元素 )def getMaxMin(v):big =v0 small =v0 for i in range(0,len(v):if bigvi
11、:small=vi return big,small#-应用举例 -a=1,2,0,5,10 x,y=getMaxMin(a)print(a=,a)print(最大元素=,x,最小元素=,y)a=张三,李四,王五,艰苦奋斗 x,y=getMaxMin(a)print(a=,a)print(最大元素=,x,最小元素=,y)a=满清皇帝听说这双刀之中有一个能无敌於天下的大秘密 x,y=getMaxMin(a)print(a=,a)print(最大元素=,x,最小元素=,y)a=1,2,0,5,10 最大元素=10 最小元素=0 a=张三,李四,王五,艰苦奋斗 最大元素=艰苦奋斗最小元素=张三a=满
12、清皇帝听说这双刀之中有一个能无敌於天下的大秘密最大元素=这 最小元素=一思考题:请推测下面代码的运行结果是什么Z=(8,4,2,10,7)X,Y=getMaxMin(Z)#getMaxMin是上面的函数print(X,Y)传入的是(int 类型的)数组传入的是(str 类型的)数组传入的是一个字符串第 3 章 简单应用题3.1 闰年的计算地球的公转周期是365.2422 个太阳日,按这个天数,地球围绕太阳公转一周后,并不是整整 365 个昼夜。因此,如果按照每年365 天算,则每到四年,地球就和四年前的位置差了近一天。这一天的公转距离需要闰(多)一日来补足,因此一般每四年就会出现一个闰年。0.
13、2422*4=0.9688=1#返回:#1=y是闰年#0=y不是闰年def leapYear(y):if(y%400)=0:lp=1 elif(y%100)!=0 and(y%4)=0:lp=1 else:lp=0 return lp#应用举例:#判断下列年份是否为闰年?#1918,1937,1949,1984,2000,2010 yy=1918,1937,1949,1984,2000,2010 for y in yy:z=leapYear(y)if z=1:s=是闰年 else:s=不是闰年 print(y,年,s)1918 年 不是闰年1937 年 不是闰年1949 年 不是闰年1984
14、年 是闰年2000 年 是闰年2010 年 不是闰年例题 2:计算 y 年 m 月共有多少天的函数getLastDay(y,m)#计算 y 年 m 月的天数def getLastDay(y,m):if y1:y=1 if m12:m=12#每个月的正常天数#月份1 2 3 4 5 6 7 8 9 10 11 12 monthDay=31,28,31,30,31,30,31,31,30,31,30,31 r=monthDay m-1 if m=2:r=r+leapYear(y)#此处调用了前面的计算闰年有函数return r例题 3:计算从公元1 年 1 月 1 日到y 年 m 月 d 日的天数
15、(含两端)例如:从公元 1 年 1 月 1 日到 1 年 2 月 2 日的天数是31+2=33 天分析:要计算从公元1 年 1 月 1 日到y 年 m 月 d 日的天数,我们分成三个部分:(1)计算从公元1 年到y-1 年,是整年,每年是365 天或366 天(如果某年是闰年)(2)对于第 y 年,当 m1 时,先计算 1 m-1 月整月的天数(3)最后加上零头(第m 月的d 天)即可这种方法,在程序设计中叫做“分而治之”。#coding=gbk#判断某年是否为闰年的函数#入口:y,int 类型,=1#返回:#1=y 是闰年#0=y 不是闰年def leapYear(y):if y1:y=1
16、if(y%400)=0:lp=1 elif(y%100)=0:lp=0 elif(y%4)=0:lp=1 else:lp=0 return lp#计算 y 年 m 月的天数def getLastDay(y,m):if y1:y=1 if m12:m=12#每个月的正常天数#月份1 2 3 4 5 6 7 8 9 10 11 12 monthDay=31,28,31,30,31,30,31,31,30,31,30,31 r=monthDay m-1 if m=2:r=r+leapYear(y)return r#计算从公元1 年 1 月 1 日到y 年 m 月 d 日的天数(含两端的函数def c
17、alcDays(y,m,d):if y1:y=1 if m12:m=12 if dgetLastDay(y,m):d=getLastDay(y,m)T=0 for i in range(1,y):T=T+365+leapYear(i)for i in range(1,m):T=T+getLastDay(y,i)T=T+d return T y,m,d=2010,9,8 T=calcDays(y,m,d)print(从 1年 1 月 1 日到,y,年,m,月,d,日 共,T,天)从 1 年 1 月 1 日到2010 年 9 月 8 日 共 734023 天例题 4 求某年某月某日是星期几?分析:
18、公元 1 年 1 月 1 日是星期一。很久很久以前,上帝创造了天和地。(这一天定为公元1 年 1 月 1 日)第二天上帝创造空气(大气),或穹苍,称空气为天。按着上帝的命令,黑暗再次的取代了光明。这是当天的傍晚发生的。第三天,上帝创造了大海和高山。第四天,上帝创造太阳、月亮和星星。从此太阳为地球提供光和热。第五天,上帝创造了空中的鸟和水里的鱼。第六天,上帝创造各类的动物在地上。这事之后,上帝就在第七日安息了。因此,我们也当工作六日,礼拜天休息。根据这个故事,我们知道,要求出某年某月某日是星期几,只需调用calcDays(y,m,d),然后除以 7 余几就是星期几,余0就是星期日(礼拜天)。3.
19、2 计算级数的前n 项和例 1 求 Sn=1+2+3+4+5+n#coding=gbk#求 Sn=1+2+3+4+5+,+n#方法一:用累加法def calcSn1(n):if n1:return 0 s=0 for i in range(1,n+1):s=s+i return s#方法二:用等差级数的求和公式#入口:a0=第一项#n=项数#d=公差#返回:Sn#Sn=n*a0+n*(n-1)*d/2 def calcSn2(a0,n,d):if(type(a0)=int)and(type(d)=int):return n*a0+n*(n-1)*d/2 else:return n*a0+n*(
20、n-1)*d/2 n=100 print(Sn=1+2+3+4+5+n)print(n=,n)print(累加法Sn=,calcSn1(n)print(公式法Sn=,calcSn2(1,100,1)Sn=1+2+3+4+5+nn=100 累加法Sn=5050 公式法Sn=5050例 2 求 Sn=1+11+111+1111+.+1111111(最后一项是n 个 1)分析:第 1项T 1=1 第 2项T2=11=T1*10+1 第 3项T3=111=T2*10+1 .即后一项=前一项*10 加 1#coding=gbk#求Sn=1+11+111+1111+,+1111,111(最后一项是n 个
21、1)def calcSn(n):T=1 S=0 for I in range(1,n+1):S=S+T T=T*10+1 return S n=3 print(S,n,=,calcSn(n)S 3=123 说明:本算法对python 没有问题。对于C+或 delphi,由整数可以表示的范围太小(用实数,得出的结果又不够精确),当 n 较大时,需要先解决大数运算问题。例 3 求 Sn=1-3+5-7+9-11+.分析:序号 I 第 I 项的符号第 I 项的绝对值1+1 2-3 3+5 4-7 I(-1)*(I+1)2*I-1 观察:(1)第 I 项 XI的绝对值与 其前一项XI-1的绝对值的关系
22、:|Xi|=|Xi-1|+2(2)第 I 项 XI的符号 FI与 其前一项XI-1的符号 FI-1的关系:FI=-FI-1#coding=gbk#求 Sn=1 -3 +5 -7 +9 -11 +,.def calcSn(n):X=1 S=0 F=1 for I in range(1,n+1):S=S+F*X X=X+2 F=-F return S n=4 print(S,n,=,calcSn(n)S 4=-4 例 4 计算.!61!51!41!31!211要求:计算的相对偏差小于10-5#coding=gbk#计算 sn=1-1/2!+1/3!-1/4!+.#要求:计算的相对偏差 1E-5*(
23、abs(sn)+abs(s1):#如果还没有达到计算精度 s1=sn else:break print(sn=,sn)sn=0.632120811287 例 5 计算a的方法是:(1)给出初值x1=1.0,(2)11(212xaxx(3)如果 x1 与 x2 很接近,则 x2 是a的值,否则以x2 代替 x1,转(2)。#coding=gbk#求 a 的算术平方根的近似方法def mysqrt(a):if a 1E-5*(abs(x2)+abs(x1):#如果还没有达到计算精度 x1=x2 else:break return x2 a=2 print(a,的算术平方根=,mysqrt(a)a=
24、3 print(a,的算术平方根=,mysqrt(a)2 的算术平方根=1.41421356237 3 的算术平方根=1.73205080757例 6 求 10-7M HNO3溶液的 pH值。分析:我们都知道强酸的稀溶液中,它是完全电离的。即HNO3电离出的H+与 NO3-都是10-7 M,但是我们不能认为它的pH 值=7.H2O=H+OH-Kw=1E-14 计算方案:令 x1=OH-=1E-7(1)H=C+X1(2)X2=Kw/H(3)如果X1 与 X2 很接近,则转(4),否则令 X1=X2,转(1)(4)pH=-log 10 H#coding=gbk#计算 1E-7M 的硝酸溶液的pH值
25、#令 x=OH#则 H=OH+C#OH新 =kw/H import math def calcPH(C):kw=1E-14 x1 =1E-7 while True:H=x1+C x2=kw/H if abs(x2-x1)1E-5*(abs(x2)+abs(x1):#如果还没有达到计算精度 x1=x2 else:break return-math.log10(H)C=1E-7 print(C,M的硝酸溶液的pH=,calcPH(C)1e-07 M 的硝酸溶液的pH=6.79101457082 讨论:也许,你觉得我们令 x=OH,则(C+x)x=Kw解一元二次方程就可以了,何必这么麻烦呢?在这里,
26、我们是为了说明一种解题的方法-“迭代法”。第 4 章 溶液中的酸碱平衡4.1 弱酸水溶液的分布系数三元弱酸水溶液的电离平衡/3./2./1.332232.232HAAHkAHHAAHHAHkHAHAHAHAHHkAHHAHOHHKwOHHOH略去电荷,根据电离平衡常数得:H2A=H3A*k1/H HA=H2A*k2/H=H3A*k1*k2/H2A=HA*k3/H=H3A*k1*k2*k3/H3酸的总浓度C=H3A+H2A+HA+A=H3A+H3A*k1/H+H3A*k1*k2/H2+H3A*k1*k2*k3/H3=H3A(1+k1/H+k1*k2/H2+k1*k2*k3/H3)由此可得分布系数
27、的公式:3*2*1*2*1*13*2*13*2*1*2*1*1*2*13*2*1*2*1*1*13*2*1*2*1*123232322233323kkkHkKHkHkkKCAkkkHkKHkHHkKCHAkkkHkKHkHHkCAHkkkHkKHkHHCAHAHAAHAH题目:计算 0.1M NaHAc(草酸氢钠)溶液的 pH值 k1=0.0562 k2=5.248e-05 分析:(1)溶液中的物种:H+,OH-,Na+,H2Ac,HAc-,Ac=(2)草酸的分析浓度(即草酸的各种形式的总和)C=0.1M:H2A=H2A*C=f0(C,k1,k2,H)HA=HA*C=f1(C,k1,k2,H)
28、A=A*C=f2(C,k1,k2,H)OH=kw/H Na=C 以上各种浓度除Na 外,均是H,k1,k2,C 的函数(3)为了求取H,它们需要满足电荷平衡:H+Na=HA+2A+OH 即:0)2*1*1*1*22*1*1*1*(22kkHkHHkCkkHkHHkCHkwCH求解这个方程,则这个H 的值就是溶液的H+,从而可以求出溶液的pH 值。4.2 求解一元方程y=f(x)=0 方程 f(x)=0 有实数解的情况:对于连续函数f(x)如果f(Xa)与 f(Xb)符号相反,则方程在(Xa,Xb)之间至少存在一个解。对于上面的问题,我们根据化学知识,知道ph 一定在 0,14 之间,于是我们设
29、计了下面的一个计算方案-迈步法:(1)给定 pH 初始范围a0,b0=0,14 (2)将区间分为n=100 等分对每个小区间进行探索,ai,bi 如果f(ai)与 f(bi)符号相反,则找到了新的求解区间 ai,bi 求解区间结束否则n=n*2 转(2)#coding=gbk#计算 0.1M 的草酸氢钠水溶液的pH 值#k1=0.0562 k2=5.248e-05 import math C=0.1 k1=0.0562 k2=5.248e-05 def Q(H):kw=1E-14 OH=kw/H HA=C*k1*H/(H*H+k1*H+k1*k2)A=C*k1*k2/(H*H+k1*H+k1*
30、k2)q=(H+C)-(OH+HA+2*A)#电荷平衡return q def maibu(a0,b0):n=100 while True:dh=(b0-a0)/n haveFind=0 for i in range(0,n):ai=a0+i*dh bi=ai+dh fa=Q(10*(-ai)fb=Q(10*(-bi)if fa*fb=0:haveFind=1 break if haveFind=0:n=n*2 else:break return ai,bi a1,b1=maibu(0,14)print(a1,b1)2.8 2.94 通过一次迈步法的搜索,我们得到,溶液的pH 值在2.8 与
31、2.94 之。当我们得到了一个小区间后,可以进一步的搜索,得到更小的区间。那么何时停步搜索呢?如果小区间的两端非常接近了,则可以停止搜索,取该区间的中点就是我们要求的pH 值。方案如下:(1)A0,B0=0,14(2)进行一次搜索:a1,b1=maibu(a0,b0)(3)如果a1 与 b1 很接近,则ph=(a1+b1)/2,停止搜索否则,令 a0=a1,b0=b1,转(2)#coding=gbk#计算 0.1M 的草酸氢钠水溶液的pH 值#k1=0.0562 k2=5.248e-05 import math C=0.1;k1=0.0562;k2=5.248e-05 def Q(H):kw=
32、1E-14;OH=kw/H HA=C*k1*H/(H*H+k1*H+k1*k2)A=C*k1*k2/(H*H+k1*H+k1*k2)q=(H+C)-(OH+HA+2*A)return q def maibu(a0,b0):n=100 while True:dh=(b0-a0)/n haveFind=0 for i in range(0,n):ai=a0+i*dh bi=ai+dh fa=Q(10*(-ai)fb=Q(10*(-bi)if fa*fb=1E-5*(abs(a1)+abs(b1):a0,b0=a1,b1 else:ph=(a1+b1)/2 break print(pH=,ph)pH
33、=2.866829 例 6 求 10-7M HNO3溶液的 pH值。分析:我们都知道强酸的稀溶液中,它是完全电离的。即HNO3电离出的H+与 NO3-都是10-7 M,但是我们不能认为它的pH 值=7.H2O=H+OH-Kw=1E-14 计算方案:令 x1=OH-=1E-7(1)H=C+X1(2)X2=Kw/H(3)如果X1 与 X2 很接近,则转(4),否则令 X1=X2,转(1)(4)pH=-log 10 H#coding=gbk#计算 1E-7M 的硝酸溶液的pH值#令 x=OH#则 H=OH+C#OH新 =kw/H import math def calcPH(C):kw=1E-14
34、x1 =1E-7 while True:H=x1+C x2=kw/H if abs(x2-x1)1E-5*(abs(x2)+abs(x1):#如果还没有达到计算精度 x1=x2 else:break return-math.log10(H)C=1E-7 print(C,M的硝酸溶液的pH=,calcPH(C)1e-07 M 的硝酸溶液的pH=6.79101457082 讨论:也许,你觉得我们令 x=OH,则(C+x)x=Kw解一元二次方程就可以了,何必这么麻烦呢?在这里,我们是为了说明一种解题的方法-“迭代法”。3.3 水溶液中的酸碱平衡问题例 1 求 0.02M H2A溶液的 pH值(117
35、106.52,102.41kk)分析:(1)电离平衡/2./1.2.22HAAHkAHHAAHHAHkHAHAHOHHKwOHHOH(2)物料平衡2AHAAHC(3)电荷平衡:*2AHAOHH在该体系中有5 个物种(H、OH、H2A、HA、A,为了方便我们略去了电荷),共有5 个方程,只要解出这个方程组即可。然而,这个方程组解起来不是很方便,是吗?在无机或分析化学中,您一定学过几种近似公式,对于解这道题想信是难不住你的。但在此处,我们想找出一种让计算机求解的方案。(4)根据电离平衡,我们得到:3./*1*2/*22./*11./222HAHKKHHAKAHAHKHAHkwOH将、式代入电离平衡
36、:4.)./1*2/*11/()/1*2/*11(/*1*2/*122222222HKKHKCAHHKKHKAH即CHAHKKHAHKAHC二元弱酸的分布系数:2*1*12*12*1*1*12*1*1222222kKHkHkKCAkKHkHHkCHAkKHkHHCAHAHAAH于是我们得到下面的计算方案设 H1=1E-7(A)计算 OH,H2A,HA,A的浓度HHAKAHAHKHAHKKHKCAHHkwOH/*2./*1)/1*2/*11/(/222(B)根据电荷平衡求出H2=*2AHAOHH(C)如果H1 与 H2 很接近,则 H2 就是我们所求的氢离子浓度,否则H1=H2 转(A)重新计算
37、#coding=gbk#计算计算0.02M 的 H2A 溶液的 pH 值#k1=4.2E-7 k2=4.6E-11 import math def calcH2A(C,k1,k2):kw=1E-14 H1=1E-7 while True:OH=kw/H1 H2A=C/(1+k1/H1+k1*k2/H1/H1)HA=k1*H2A/H1 A=k2*HA/H1 H2=OH+HA+2*A#电荷平衡if abs(H2-H1)1E-5*(abs(H2)+abs(H1):#如果还没有达到计算精度H1=H2 else:print(OH,H2A,HA,A,H=,OH,H2A,HA,A,H2)break retu
38、rn-math.log10(H2)C=0.02 k1=4.2E-7 k2=4.6E-11 print(C,M 的 H2A 的 pH=,calcH2A(C,k1,k2)OH,H2A,HA,A,H=1.09358016369e-10 0.0199085592111 9.1440742852e-05 4.59989799665e-11 9.1440944208e-05 0.02 M 的 H2A 的 pH=4.03885929812例 2 计算 0.1M NaHA 溶液的 pH值 k1=0.0562 k2=5.248e-05(1)电离平衡/2./1.2.22HAAHkAHHAAHHAHkHAHAHOH
39、HKwOHHOHHANaNaHA(2)物料平衡2AHAAHC(3)电荷平衡:*2AHAOHNaH第 8 章 数的进制8.1 二进制简介一、二进制二进制是计算技术中广泛采用的一种数制。二进制数据是用0和 1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,由 18 世纪德国数理哲学大师莱布尼兹发现。当前的计算机系统使用的基本上是二进制系统。二、二进制数据的表示法二进制数据也是采用位置计数法,其位权是以2 为底的幂。例如二进制数据110,其权的大小顺序为22、21、20。对于有 n 位整数的二进制数据用加权系数展开式表示,可写为:0022110212*.2*2*.a
40、aaaaannnnnn注意:(1)式中 aj 表示第 j 位的系数,它为0 和 1 中的某一个数。(2)a(n-1)中的(n-1)为下标三、二进制运算规则二进制数据的算术运算的基本规律和十进制数的运算十分相似。最常用的是加法运算和乘法运算。1.二进制加法有四种情况:0+00 0+11 1+01 1+10 进位为 1【例】求(1101)2+(1110)2的和解:1101101110101102.二进制减法000,101,110,011 借位 1。(借 1 作 2)3.二进制乘法000 100 010 111 4.二进制除法010,111。5.二进制与运算&0&0=0 0&1=0 1&0=0 1&
41、1=1 6.二进制或运算|0|0=0 0|1=1 1|0=1 1|1=1 7 二进制非运算 0=1 1=0 8.2 二进制的存储方法二进制在python,C,Delphi,javascript 语言中均未提供直接的存储方法,此处我们使用两种格式:数组法及字符串法。一、数组法0,1,1,0,1 每个元素表示二进制的一个位,左边为高位,右边为依位。每个元素是0或 1。二、字符串法“01101”每个元素表示二进制的一个位,左边为高位,右边为低位。每个元素是”0”或”1”。三、数组表示法转化为字符串表示法#coding=gbk A=0,1,1,0,1#转化为字符串表示法:S=.join(str(x)f
42、or x in A)print(S)01101 四、字符串表示法转化为数组表示法#coding=gbk S=100100 A=int(x)for x in S print(A)1,0,0,1,0,0 8.3 二进制与十进制的转换一、十进制非负整数转化为二进制#coding=gbk#EX-01 十进制整数转化为二进制.py#十进制非负整数x 转化为二进制的数组表示法#入口:#x 要转化非负整数#n 二进制的最大位数#返回:#R=x转化为二进制的数组def intToBinArr(x,n):x=abs(int(x)n=abs(int(n)if n1:n=1 R=0 for i in range(0
43、,n)for i in range(n-1,-1,-1):Ri=x%2 x=x/2 return R#十进制非负整数x 转化为二进制的字符串表示法#入口:#x 要转化非负整数#n 二进制的最大位数#返回:#S=x转化为二进制的字符串表示法def intToBinStr(x,n):R=intToBinArr(x,n)S=.join(str(y)for y in R)return S print(intToBinArr(7,8)print(intToBinStr(7,8)0,0,0,0,0,1,1,1 00000111二、二进制数组表示法转化为十进制非负整数#coding=gbk#EX-02 二进
44、制数组表示法转化为十进制非负整数.py#十进制非负整数x 转化为二进制的数组表示法#入口:#x 要转化非负整数#n 二进制的最大位数#返回:#R=x转化为二进制的数组def intToBinArr(x,n):x=abs(int(x)n=abs(int(n)if n1:n=1 R=0 for i in range(0,n)for i in range(n-1,-1,-1):Ri=x%2 x=x/2 return R#二进制数组表示法转化为十进制非负整数#入口:#a 二进制数组#返回:#x 十进制整数def binArrToInt(a):x=0 n=len(a)for i in range(0,n
45、):x=x*2+ai return x x =123 a =intToBinArr(x,8)y =binArrToInt(a)print(x=,x)print(a=,a)print(y=,y)x=123 a=0,1,1,1,1,0,1,1 y=1238.4 二进制用法举例二进制是计算机科学的基础,要穷举它的用途是不可能的。此处,我们仅举几个例子以启发我们的解题思路。一、有四个位置,每个位可以取0,1 两个值,列出所有的可能排列。根据排列组合,m(此处=4)个位置,每个位置有n(此处=2)种可能,共有nm种可能,即从0 到 nm-1,每种可能的排列,刚好是将十进制数其转化为二进制的数组表示。#c
46、oding=gbk#EX-03 有四个位置,每个位可以取 0,1 两个值,列出所有的可能排列.py#-#十进制非负整数x 转化为二进制的数组表示法#入口:#x 要转化非负整数#n 二进制的最大位数#返回:#R=x转化为二进制的数组def intToBinArr(x,n):x=abs(int(x)n=abs(int(n)if n1:n=1 R=0 for i in range(0,n)for i in range(n-1,-1,-1):Ri=x%2 x=x/2 return R print(有四个位置,每个位置可以取 0,1 两个值,列出所有可能的排列)m=4 n=2 nm=n*m print(
47、共有,nm,种排列,它们是)for x in range(0,nm):a=intToBinArr(x,m)print(x=,x,a=,a)有四个位置,每个位置可以取0,1 两个值,列出所有可能的排列共有16 种排列,它们是x=0 a=0,0,0,0 x=1 a=0,0,0,1 x=2 a=0,0,1,0 x=3 a=0,0,1,1 x=4 a=0,1,0,0 x=5 a=0,1,0,1 x=6 a=0,1,1,0 x=7 a=0,1,1,1 x=8 a=1,0,0,0 x=9 a=1,0,0,1 x=10 a=1,0,1,0 x=11 a=1,0,1,1 x=12 a=1,1,0,0 x=13
48、 a=1,1,0,1 x=14 a=1,1,1,0 x=15 a=1,1,1,1二、有四个位置,每个位置可以取“A”,“B”两个值,列出所有的可能排列。该题是上题的推广之一。#coding=gbk#EX-04 有四个位置,每个位置可以取“A”,“B”两个值,列出所有的可能排列.py#-#十进制非负整数x 转化为二进制的数组表示法#入口:#x 要转化非负整数#n 二进制的最大位数#返回:#R=x转化为二进制的数组def intToBinArr(x,n):x=abs(int(x)n=abs(int(n)if n1:n=1 R=0 for i in range(0,n)for i in range(
49、n-1,-1,-1):Ri=x%2 x=x/2 return R print(有四个位置,每个位置可以取“A”,“B”两个值,列出所有的可能排列)an=A,B m=4 n=2 nm=n*m print(共有,nm,种排列,它们是)for x in range(0,nm):a=intToBinArr(x,m)b=ani for i in a print(x=,x,b=,b)有四个位置,每个位置可以取“A”,“B”两个值,列出所有的可能排列共有 16 种排列,它们是x=0 b=A,A,A,A x=1 b=A,A,A,B x=2 b=A,A,B,A x=3 b=A,A,B,B x=4 b=A,B,A
50、,A x=5 b=A,B,A,B x=6 b=A,B,B,A x=7 b=A,B,B,B x=8 b=B,A,A,A x=9 b=B,A,A,B x=10 b=B,A,B,A x=11 b=B,A,B,B x=12 b=B,B,A,A x=13 b=B,B,A,B x=14 b=B,B,B,A x=15 b=B,B,B,B三、穷举法解背包问题:有一个背包可放入的物品总重量20 公斤,共有8 件物品,重量分别为1,7,3,8,5,10,11,4 公斤。问:从这些物品中如何找出若干件,刚好是20 公斤?(不考虑体积)分析 :我们把 8 件物品,看作8 个位置,每个物品被选中记作1,不被选中记作0。