还剩47页未读,继续阅读
本资源只提供10页预览,全部文档请下载后查看!喜欢就下载吧,查找使用更方便
文本内容:
浙江省普通高中Python程序设计教学基础实例浙江省浦江中学方春林12345
②输入5,屏幕是上显示“54321〃本题也是将数据123,4,5拼接得到的结果,拼接的时候是最先出现的1在最后面,最后出现的5在最前面这就像排队时,后来的人插队,排在了前面我把它称为“插队累加”代码如下S=for i in ranged,6s=str i+s print s运行结果如下
543212.字符串累加模板“排队累加”中看出变量i从1递增到5,程序每次将i累加到字符串s的后面程序模板如下S=for i in ranged,n:s=s+x X是待累加的字符串数据,S是累加的结果“插队累加”中看出变量i从1递增到5,程序每次将i累加到字符串s的前面程序模板如下S=for i in ranged,n:s=x+s X是待累加的字符串数据,S是累加的结果
3.实例讲解输入数据5,在屏幕上打印如下的数字图形111221123321123443211234554321排队累加插队累加从图上看出输出共5行,第i行打印的数据是第i-1行的内容加上i,因此这是字符串累加问题再观察发现左边的是字符串的排队累加,右边的是插入累加,代码如下:S=s-for i in ranged,6for i in ranged,6:s=str i+s s=s+str i print sprint s练习
①十进制数转BCD码5421BCD码是一种采用四位二进制数表示一位十进制是的编码,其各位的权依次为5,4,2,1,并要求大于等于5的十进制数所对应的编7533A上进制数101010000011码最高位为1(如十进制数7所对应的“5421BCD”码为1010)o转换时,将十进制数从右往左按位转换成对应的“5421BCD”码,然后依次连接(程序运行如右图)
②.输入1个整数,输出如下的图形1099988888T77777766668666655555555555444444444444433333333333333322222222222222222第四讲秦九韶算法秦九韶算法是中国南宋时期的数学家秦九韶提出的一种多项式简化算法一般地,一元n次多项式的求值需要经过n+l*n/2次乘法和n次加法,而秦九韶算法只需要n次乘法和n次加法
1.数学描述把一个n次多项式改写如下所示fx=a,,x n+a,,-ix n~l+---+a\X+ao=an xn++…+4速+QQ=即/-1+an.\X n~2+---+a2X+a\x+ao=金/-2+•••a3x+«2x+fli x+Go■■■=・・・n〃x+aw-ix+即_2x+・・・+即x+劭求多项式的值时,首先计算最内层括号内一次多项式的值,ans0二an ansi=ansO*x+an-i然后由内向外逐层计算一次多项式的值,即ans2=ansi*x+an-i ansn=ansn-i*x+ao这样,求n次多项式fx的值就转化为求n个一次多项式的值
2.算法描述
①输入f x的系数aO,al,…,an,输入x的值
②答案ans初始化为an
③对于I=1,2,3…,n,循环执行ans=ans*x+an-i
④输出ans
3.流程图描述给入多项式系数和X秦九湍律法流程图
4.程序代码n=int input”请输入多项式项数\n xs二list mapint,input.splitX=int input输入x的值ans=xs[n]for i in range1,n+1:ans=ans*x+xs[n-i]print ansxs列表中存放多项式系数,多项式格式为f x=xs[n]*x**n+xs[nT]*x**n-l+…+xs[l]*x+xs
[0]练习
①输入一个正整数,计算各位数之和第五讲对称数(回文)对称数是指从左到右读和从右到左读是完全一样的数据下面分数值类型和字符串类型两类进行描述
1.对称数
1.1对称数的判断思路及算法判断某数是否为对称数,只需要生成该数的逆序数,然后判断这两者是否一致生成逆序数的方法可以使用秦九韶算法如数据X=12321,生成它的逆序数的方法1|2|3|2|1逆序数结果保存在变量rst中,首先赋初值0即rst=0,接下来的步骤如下
①取出倒数第1位1,并计入结果变量rst中,rst=10*rst+1
②取出倒数第2位2,并计入结果变量rst中,rst=10*rst+2•••
⑤取出倒数第5位12,并计入结果变量rst中,rst=10*rst+1最后再判断x和rst是否相同,相同为对称数,否则不是
1.
2.对称数代码实现x=int(input())num二x rst=0while x0rst=rst*10+x%10x=x//10if num==rstprint(是对称数)elseprint(〃不是对称数”)
1.
3.生成对称数从数字1开始连续递增生成指定长度(不超过18位)的对称数如长度为5,则生成对称数12321,长度6,则生成123321思路生成n位对称数,根据n的奇数偶数分别来生成对称数步骤如下
①先生成前半部分,从1开始循环到n//2结束,利用秦九韶算法生成整数并存储在rst;
②若n为奇数,则将中间数n+1//2,添加到rst尾部;
③再生成后半部分,从n〃2开始到1结束,利用秦九韶算法生成整数并存储在rst;
1.4生成对称数代码方法1对称数分前后2部分分别生成numlen=int inputrst=0for i in range1,numlen//2+1rst=rst*10+i if numlen%2rst=rst*10+numlen+1//2for iin rangenumlen//2,0,-1:rst=rst*10+i print rst方法21个循环生成对称数n为正奇数分析奇数个数的对称数的特点,如对称数123454321,中间数mid=5第1个数x=l,与mid相差y=4第2个是x=2,与mid相差y=3第3个是x=3,与mid相差y=2123454321第7个数x=3,与mid相差y=2第8个数x=2,与mid相差y=3第9个数x=l,与mid相差y=4发现规律没有?x加yx与mid的差值的绝对值等于1个常量mid的值代码如下rst=0mid=numlen+1//2for iin ranged,numlen+1:rst=rst*10+mid-absmid-i print rst2对称字符串或回文
2.1对称字符串的判断2个思路思路1与对称数的判断方法一样,利用字符串累加方法生成原始字符串的逆序字符串,然后判断生成的字符串与原始字符串是否相同代码请同学们完成思路2假定字符串长度为n,逐个判断第1个和倒数第1个是否相同,…,第i个与第n-i-l个是否相同,直到n//2为止若有一次取出的前后两个字符不相同,说明不是对称字符串,否则就是对称字符串
2.2思路2程序代码strs=input nlen=lenstrs flag=True for iin rangenlen//2:if strs[i]!=strs[nlen-i-1]flag=False breakif flag:print〃是对称字符串”else:print不是对称字符串〃3生成对称字符串生成对称字符串与生成对称数类似,不同的数据类型发生改变,原来是数字,现在变成字符串
3.1生成以字符”a〃开始长度nn=52的字符串思路与生成对称数一样,有两种不同的方法思路1分前后两部分生成思路2利用字符串累加原理请自行完成代码思路3利用一个循环一次生成循环序列请自行完成代码思路1程序代码nlen=int inputrst=firstch=a for iin rangenlen//2rst=rst+chrordfirstch+i if nlen%2:rst=rst+chr ord firstch+nlen-1//2for iin rangenlen〃2-1,-1,-1:rst=rst+chr ordfirstch+i print rst练习
①生成对称字符串的其它两个思路的程序实现
②编写程序生成左下图的菱形****KA*****第六讲进制转换专题计算机中所有数据都用二进制表示,而现实生活中更多的是十进制的数据因此需要对不同的进制进行转换
6.1二进制数转十进制数L二进制数转换为十进制数算法及程序实现以二进制数”1011B”转换为十进制数为例讲解转换步骤方法1逐位按权值求和(从左往右)1011B=1*213+0*2c2+1*21+1*2-0
①思路上述表达式
①中可以看成是4个数字x相加,每个x有什么特征呢?x是二进制数的某1位数字*相应的权值该过程就是一个4个数据累加的过程,因此可以用累加语句模板来实现将二进制数转换为十进制数代码实现binary=1111#二进制数binarylen=len binarys=0#二进制数的长度for iin rangebinarylen:a=intbinaryEi]b=2**#枚举二进制数的每一位binarylen-i-1x=a*b之取出二进制数的每一位,转换为整型s+=x print s#计算权值#累加方法2逐位按权值求和(从右往左),这是取的方向不一样,结果是一致的1011B=1*2八0+1*2」+0*2八2+1*2-3
②思路同方法1,只是数据的位置发生改变,代码如下binarv=1011#二进制数binarylen=len binary#二进制数的长度s=0for iin rangebinarylen:枚举进制数的每一位•取出进a=int binary[binarylen-制数的每一位,转换为整型计并值b=2**i x=a*b*累加s+=x print s上述代码中,如果熟练了就没有必要变量a,b分步写,可以直接写一个表达式这样写为L s/C###\1/U IX1了让学生初学时更好理解方法3运用秦九韶算法,该算法是中国南宋时期的数学家秦九韶提出的一种多项式简化算法通俗的说十进制数x,在其尾数加一位数y,得到新的数z,则z=10*x+y;同理对于任何二进制数x,其尾数加一位数y,得到新的数z,则z=2*x+y将二进制数“1011B”转换为十进制数的分步过程如下表1011B二进制数每1位初始值s=0第1次取的数1s=2*s+1第2次取的数0s=2*s+0第3次取的数1s=2*s+1第4次取的数1s=2*s+1经过以上4个步骤,s的值就是该二进制数所对应的十进制数怎么转换为代码呢,通过观察同样是累加问题应用累加模板代码得到如下代码binary=1011〃#二进制数binarylen=len binary*二进制数的长度s=0for iin rangebinarylen#枚举二进制数的每一位x=int binary[i]#逐位取出二进制数s=2*s+x#累加print s以上是二进制数转换为十进制数的3种方法,1,2两种方法其实是一样的,只是顺序不一样而已,第3种方法比较简单明了其它进制转换为十进制数原理是一样的,只需要将相应的权值基数2改掉即可,如十六进制转为十进制数,将程序中2改成16即可
2.pythonic Python实现上述问题,有pythonic的方式实现现介绍2种方法
①列表生成式42s=sum[intx*2**lenbina-k-l fork,x inenumeratebina]|43prints
②利用lambda表达式和reduce函数7from functoolsimport reduce9a=reducelambda x^y:2*x+yJ data
③除此之外,python利用int方法,将一个数字字符串转换十进制数函数int原型class intx,base=10参数x-字符串或数字base~进制数,默认十进制返回值返回整型数据函数int一般用于将数值字符串转换为数字十进制数,但是如果加上base参数,就可以将不同进制数转换为十进制数如上述的二进制数”1011B”转换可以用下面的代码38s=intieil,239prints练习
①编程实现十六进制数转换为十进制数
②[浙
2018.4选考14]某种编码以4位二进制码为一组,每组前两输入编码字符中00000101位表示方向,后两位表示距离编写一个程序,将编码翻译成方向和布0南1距离,距离值为每组编码后两位二进制码转换为十进制数的值如右图
6.2十进制数转二进制数
①13除以2,得到商6,余数1;
②6除以2,得到商3,余数0;
③3除以2,得到商1,余数1;
④1除以2,得到商3余数1;
⑤商为0,结束依次将步骤
④③②①得到的余数前后连接起来,结果是11012注意结果是余数的倒序排列可以应用字符串的插队累加模板
2.程序实现思路除2取余法,并利用字符串的插队累加得到最终结果num=int inputrst=while num0:r=num%2num=num//2rst=strr+rst printrst
3.十进制数转十六进制数思路与十进制数转二进制数一样,只需要将权值2改为16;同时处理好余数大于9的数字转换为字母〃ABCDEF〃的问题代码如下def dTohnumHTABLES=”0123456789ABCDEF#十六进制数元素rst二while nuin0r=nuin%#取16的余数num=num//1616rst二HTABLES[r]+rst#余数插队累加return rst上述代码中取得的余数转换成十六进制数应用了一个对照表;也可以利用chr函数将大于9的数值转换为十六进制元素〃ABCDEF〃,代码如下def dToh2num〃〃rst二while num0r=num%16#取16的余数num=num//16if r9rst=chrr+55+rst#余数插队累加elserst=chrr+48+rst return rst练习
①[浙
17.4学考14]奇偶校验是一种校验数据传输正确性的方法其中奇校验方法统计二进制数据的数位中“1”的个数,若个数为奇数,则校验位值为3否则校验位值为1小李编写了一个计算奇校验位值程序,功能如下输入1〜255十进制待校验数,输出该数的二进制数及校验位值
②编写程序求一个负整数的反码(提示原码即将一个整数转换为二进制数,正数的反码等于原码,负数的反码等于原码逐位取反)
③求一个十进制负数(范围-127〜-1)的8位二进制补码
6.3二进制与十六进制相互转换1十六进制数转换为二进制数思路将十六进制数中的每一位转换为四位二进制数并累加;本问题难点是将十六进制中的元素A-Z转化为相应的十进制数10-15o代码如下def htobhexnum:rst=for iin hexnum:#枚举卜六进制数中的每个元素if i=A and i=F#A-F字母的转化为10T5t=ordi-55elif i=0,and i=9:#数字的转化为0-9t=int i elseprint\error breakrst+=dtobt return rst defdtobnumrst=for iin range4#十进制数转二进制数rst=strnum%2+rst num=num//2return rst二进制数转换为十六进制数思路将二进制数从右往左每隔4位分割,并将之转换为一位十六进制数,最后逐位按字符串插队累加def btohbinary:rst=hextables=M0123456789ABCDEF i=lenbinary-1while i=0:if i=3:t=binary[i-3:i+1]else:t=binary[:i+1]h=btodt printh,,hextables[h]rst=hextables[h]+rst i-=4return rstdef btodbinary:r=0for iin binary:r=r*2+inti returnr程序将四位二进制数转换为十进制数自定义了一个函数btod来实现,也可以使用int函数来实现该问题本实例是从右往左逐位取出并转换为十六进制数,也可以从左往右取出,并将之转换为十六进制数;代码请自行实现第七讲字符串专题
7.1字符串一般操作字符串的一般操作有字符串的插入,删除,修改,查找等操作
1.查找在字符串source中查找指定的关键字key,若存在,则返回第1次出现该key的位置,否则返回-1思路从字符串第1个位置开始,取出关键帧key长度的子串,并与关键字key比较,若相同则返回该位置,否则继续,直到字符串结束程序代码实现def searchStrsourceStrJkey:result=-1i=0end=lensourceStr-lenkey+1while iend:if sourceStrfi:i+lenkey]!=key:i+=1else:result=i breakreturn result r=searchStr,12345678123451251245*,*12451printr
2.插入字符串编写函数实现字符串中指定位置前插入指定的字符串key思路先找到插入字符串的位置,然后插入指定的字符串key程序代码1利用切片实现strs=input”请输入原始字符串\n pos=int inputi疗输入侍插入的位置\rT key二input〃请输入待插入的字符\「def insertPosStrstrs,pos=0,key二’’:if poslenstrsresult=strs+key elseresult=strs[pos-1]+key+strs[pos-l]return result result=insertPosStr strs,pos,key#调用函数printresult程序代码2用循环逐一取字符并累加到结果变量中def insertPosStr2strs,pos=0,key=:result=if poslenstrsreturn strs+key fork,v inenumeratestrsif k=pos-1:result=result+key+v elseresult+=v return resultresult=insertPosStr2strs,pos,key#调用函数print result该函数参数说明strs原始字符串,pos待插入的位置,key待插入的字符串
3.删除字符串输入原始字符串,输入待删除的key,返回删除key后的字符串例如原始字符串souceStr=〃abcabdabcfab,key=〃abc〃如下图下标01234567891011元素思路1原始字符串不变,将与key比较后,不同的字符串保存到新的变量中算法流程如下置初值i=0
①当i=lensourceStr-lenkey,从位置i开始取出子串长度lenkey将取出的子串与key比较,若相同转
②,否则转
③②i=i+lenkey,转
①③将该字符souceStr[i]累加到结果变量result中,并转
①程序代码如下def deleteStrsourceStr,key:result=i=0end=lensourceStr-lenkey+1while iend:print sourceStr[i:i+lenkey]if sourceStrLi:i+lenkey]!=key:result+二sourceStr[i]i+=1elsei+=len keyif i!=lensourceStr:result十二sourceStr[i:]return resultr=deleteStr1234567812345124512,T29#调用函数printr思路2找到key字符串后修改原始字符串置初值i=0,s=lensourceStr
①当s-i=lenkey,从位置i开始取出子串长度lenkey,将取出的子串与key比较,若相同转
②,否则转
③②将key内容从原始字符串中删除,转
①③继续下一个位置查找即i=i+l,并转
①程序代码如下def deleteStr2sourceStr,kev:i=0s=len sourceStrwhile s-i=lenkeyprint sourceStr[i:i+lenkey]if sourceStr[i:i+lenkey==key:sourceStr=sourceStr:i]+sourceStr Ei+lenkey:]s=len sourceStri=i+1return sourceStr r=deleteStr21234567812345124512,T2printr
4.其它将字符串中的小写字母变大写字母⑴常规思路:枚举字符串中每1个字符,碰到小写字母的将之转换为大写字母因为字符串是不可变对象,因此,需要定义一个新的对象保存新的字符串程序代码如下strs=input请输入一字符串\nrst=for chin strsif ch=a and ch=zrst+=chrordch-32else:rst+=ch printrst2pythonic方法python中提供lower、uppercapitalizetitleswapcase这几个方法分别实现字符串转换为小写、大写字符串、字符串首字母变为大写、每个首字母变为大写以及大小写互换因此,上述问题可以用如下代码实现rst=strs.upperprintrst字符串函数的使用举例s=,what isYour Nameprint s.lower#返回小写字符串print s.upper#返回大写字符;;print s.capitalizeO#字符串首字符大写print s.titleO prints.swapcase#每人单词的首字母大写运行结果#大小官互换what isvour nameWHAT ISYOUR NAMEWliat isyour nameWhat IsYour NameWHAT ISyOUR nAME练习
①输入数字的年份转换为中文年份,比如输入2018,输出“二一八”
②输入一串字符,将字符串后面相同的字符删除只剩下一个请输入字符串abcadfebxccha abcdfexh
③输入一个大于10000的正整数,程序会去除其中4个数字,在保证余下的数字不改变顺序的情况下其数值最大运行结果如下图请输入一个整数
654321657.2字符串中取数字取出字符串中连续数字,并加以处理如有字符串”aba123aA456a655”,则输出[123,456,655]本节讲解解决该问题的3种思路思路
1.数字字符串累加法从字符串第1个字符开始,碰到数字的,把它取出来累加到变量中,碰到非数字字符时,将变量追加到结果列表中,同时清空变量,重复上述过程,直到字符串结束strs=asdfadsf34sdfasfasf8asfdjk233asdf2334asdf23,.,al,78,0,48”def getNums:if lens==0:return Nonenum=result=[]for iin sif and#如果是数字,则累加num+二ielseif lennum0result.appendintnum“〃num=if lennum0#
①result.appendintnum return result rl=getNumstrs【思考】
①处的if语句去掉,分析对程序结果有什么影响?思路2切片法从字符串第1个字符开始,碰到数字的,统计数字出现的次数,碰到非数字字符时,利用切片将该位置之前的长度为num的数字字符串取出来,并记录到结果列表中,同时清空计数变量num,重复上述过程,直到字符串结束def getNum2sif lens==0:return Nonenum=0result=[]for iin rangelensif and#如果是数字,则个数加1num+=1elseif num0result.appendints[i-num:i]num=0if num0:result.appendints[i+l-num:i+11returnresultr2=getNum2strs思路3利用秦九韶算法取出数字从字符串第1个字符开始,碰到数字的,把它取出来,利用秦九韶算法累加到变量num中,当碰到非数字字符时,将变量追加到结果列表中,同时清空变量num,重复上述过程,直到字符串结束def getNum3sif lens==0return Nonenum=c=0result=口for iin s:if i=0andi=〃9:#是数字的,累加到结果变量num=num*10+int ic+=1elseif c0:result.appendnum c=0num=0if c0:result.appendnum returnresultr=getNumstrs【思考】本程序中变量c的作用是什么?小结字符串一重要公式下标与长度之间的关系上图中起始下标i,结束下标j,长度L与ij的关系如下L=j+l-i字符串切片或range start,end,step生成对象时,因为end不包括,所以要生成s[i:j]包含j时必须用s[i:j+l]或rangei,j+lo字符串中取数问题中的思路2就是应用了该公式练习
①输出字符串中连续数字的最大值如〃5YgYi\qly6uVC4;81Sk〃最大数是81
②[浙
2018.11选考14]在平面坐标系中,给定一组有序的点从原点出发,依次用线段连接这些点,构成一条折线要求编写一个“计算折线长度”的程序,功能如下输入这些点的坐标值数据都用逗号分隔并以逗号结尾,程序计算这条折线的长度例如,三个点的坐标为5,10,8,12,6,17,则输入的字符串strs=”5,10,8,12,6,17为,输出
20.17
③[浙
2017.11选考14]编写“字符串生成”程输入原始》符中一python isa programminglanguage.序,实现如下功能输入多个正整数以“,”为输入位置1,18,9,9,pass分割符和结束符,这些整数代表字符位置,程序以这些整数为位置信息,依次从原始字符串字典内容提取字符并连接成新的字符串,最后输出将新的字符串如右图
7.3字符串中取单词给定一段文本中拆分单词,拆分规则是一个单词以字母开头和结束实现的思路可以参考字符串中取数字实例1一段文本中拆分单词,将单词取出存入列表思路1位置法枚举文本的所有字符,记录单词中字符的个数,以及单词的结束位置,截取单词代码如下第一讲取数问题中国象棋是中国的一种二人对抗性游戏的棋戏,可以修心养性,陶冶情操,丰富文化生活,深受广大群众的喜爱玩象棋时,必须先确定动哪一个“棋子”,然后将“棋子”移动到下一步;数学上计算两数之和,要先确定是哪2个数做加法运算;在windows中要删除某个文件,需要先选择要删除的文件,然后再执行删除操作;……我们做任何事,必须先弄清对象,然后再执行相应的操作编写程序,就是将任务用计算机能看懂的语言一行行地写好,然后交给计算机一步一步执行计算机执行指令,也需要先确定要操作的对象,比如做加法指令,必须确定要操作的两个数据而很多时候,需要指定数据中获取需要的数据——这就是取数问题根据目标数据类型不同,取数问题可以分为整数型中取数问题和字符串中取数问题下面分这两种类型分别讲解如何取数L整数型对于整数型数据,利用整除和取余方法获取各位上的数字
①已知一个两位数x,写出该数的个位数a及十位数b的python表达式a=x%10#x除以10的余数就是个位数b=x//10#整除10得到十位数
②写出三位数x的个位数a,十位数b,百位数c的python表达式a=x%10b=x//10%10或者b=x%100//10c=x//
1002.字符串型字符串取子串用切片;s[start:end:step]表示从索引start开始取,直到索引end为止,但不包括索引end,步长step举例如下def getWordNumtext:c=0chars=0rst=[]i=0for chin text:if ch=K and ch=,T orch=a and ch=z:c匕1chars F1i+=1else:if c0:rst.append text[i-c:i]c=0i+=1if c0:rst.append text[lentext-c:]return rstgetWordNumtext思路2累加法枚举文本的所有字符,遇到字母开头的,将字母累加,遇到非字母时,将累加的单词添到列表中代码如下def getWordNum2text:chars=0rst=[]1N Nwords=for cin text:if c=£andc=Z orc=a andc=z:chars+=1words+=c else:if lenwords0:rst.appendwords words=words:rst.appendwords charsF lenwordsreturn rstgetWordNum2text实例2编写程序实现英文句子每个单词首字母大写思路1首先判断文本首字符是否首字母,若是将之改成大写后保存到结果字符串中;否则直接复制到结果变量;之后枚举其他字符,并根据规则改写大写;判断首字母的条件是,当前字符是英文字母,其前一个为标点符号如〃,.;!?〃程序代码如下text=input请输入英文字符”result=text
[0]nlen=lentext if text
[0]=a andtext
[0]=〃zresult=chrordtext
[0]-32for iin ranged,nlenif text[i]=a andtext[i]=〃z:iftext[i-1]in,.;!?“result+=chrordtext[i]-32else:result+=text[i]elseresult+=text[i]printresult思路2pythonic方法python中提供字符串的title方法,自动将单词首字母变大写使用方法如下:s=9what isyour names.title WhatIs VourName练习
①[
2017.4浙选考16]小王编写了一个实现文字查找替换功能的程序,输入原始字符串,待查找的key,输入替换的文本如下图输入原始字符串内容…博客是一种个数的网络出版形式,博客一经得到r广泛的应用输入待查找的key博客输入替换的文本Blog Blog是一种个数的网络出版形式,BlogJ经得到了广泛的应用[0,15]2
②字符串分行将字符串分行分行时单词不得跨行,每行字符尽可能多但不超过40个分行算法如下1将文本框中的字符串保存到变量s中;2当s中字符个数超过40时,循环执行下列I,II步,否则跳转到3I.如果第41个字符不是英文字母,则分行位置p=40;否则,向左逐个查找,直至找到第一个非英文字母,将其位置作为分行位置p;II.截取S的前p个字符,存入列表;III.W S中未分行部分重新赋值给变量S,转到I继续处理运行结果如下图输入字符串I fellin lovewith youwatching casablanceback rowat lickeringlight,pop-coin andcokes beneaththe starsI fellin lovewith youwatching casablanceback rowat thedirven showin theflickering light,pop-coin andcokes beneaththe stars总行数4
③单词查询输入一段英文文本,输入一个字母key,程序得到包含key的单词运行结果如下图输入原始字符串raike isa student,he comesfrom china输入查找的字母c[comes,,china,]
7.4字符统计字符串中经常需要统计字母,数字的个数实例1输入一串字符串,统计数字和英文字母和其它字符的个数思路枚举字符串,并逐个判断字符串属于数字,英文字母和其他字符,并计数于不同的变量中如本题中letters表示英文字符个数,digits表示数字字符个数,others表示其它字符程序代码如下strs=input letters=0digits=0others=0for chin strsif ch=A andchO〃Z orch=a〃andch=zletters十二1elif ch〉=〃0〃andch=9”:digits+=1elseothers+=1print letters,digits,others实例2输入一串字符串,统计每个字母个数思路1英文字母有26个,统计每个字母的个数,可以定义一个列表用来存放每个字母的个数代码见下图思路1思路2定义字典来保存每个字母及个数,字母表示字典的key,个数表示字典的values代码见下图思路2和个数思路L定义列表符廿保存数量个教供付个致付一个如strs=input请输入英文字符\n〃出和费chcount=EO]*26for chin strs:机个效付if ch=a andch=〃z:index-ordch-97chcount[index]个支仃供+=1for indexin rangelenchcount:费竹print字符{},个数{}.format chr index+97,抬效价最chcount[index]存厦存效布存付一工个伊个去个存个状个思路3定义字典保存数量柞个律华个个效存个最伏、个聂出个最付个最一个数付个聂一•个酊付二个整一个聂chcount={}for chin strs:if ch=a andch=z:c=chcount.get ch,0+1chcount[ch]=c forkey insorted chcount:print字符{},个数{}format key,chcount[key]练习
①统计“英文句子单词平均长度”的程序,输入要统计的英文句子,程序输出句子中共有儿个单词、单词的平均长度单词以字母为开头和结束
②检测密码强度输入要检测的密码,输出检测结果将密码字符分为数字,字母和其它符号三类,检测方法I若密码位数少于8位,则不进行强度检测,n若密码位数8位以上的,若密码字符属于同1类字符,则密码强度为“弱”;若密码字符属于不同的二类字符,则密码强度为“中等”;若密码字符属于不同的三类字符,则密码强度为“强二-314*n z£v1*no Au41I*Az nr/*1dfn/K as--T ZMe-f3-1111n.nc3u-v.I-X-V-%J~*
77.5字符串加密凯撒密码是罗马扩张时期朱利斯•凯撒Julius Caesar创造的,用于加密通过信使传递的作战命令它将字母表中的字母移动一定位置而实现加密例如如果向右移动2位,则字母A将变为C,字母B将变为D,…,字母X变成Z,字母丫则变为A,字母Z变为Bo下面讲解具体思路思路1假定原文s=abcdefghijklmnopqrstuvwxyz,加密的规则小写字母是向后移动4位,v变z,w变a,x变b,y变c,z变d,其它不变只要逐一枚举字符串,算出ASCII码并加上4后得到加密后的字符,同时需要判断一下是否超出字母〃z〃的ASCII码,超出的需要修正代码如下def ksddjmyuanwen,step:miwen=for chin yuanwenif ch=a andch=zmw=ord ch+step ifmword,z,:,,,,miwen+=chr mw-ordz+ord a-1elsemiwen+=chrmw elsemiwen十二ch returnmiwen printksddjmabcdefghijklmnopqrstuvwxyz,,4思路2生成循环序列本题可以转化为如何生成循环序列〃0,1,2,3•••25,0,1・・・〃该序列每个数加上97就变成小写字母的ASCII码的问题本序列的大小为26,因此可以通过模26获得序列按以下步骤执行
①x%26生成1,2,3•••25,0,1…〃x=0,l,2,...
②x+4%26生成〃4,5,6•••25,0,1•一”x=0,17,...程序代码如下VW=mw=for iin range26yw+=chr i+97mw+=chri+4%26+97printyw,mw,sep=\n运行结果如下abcdefghi jklmnopqrstuwxyzefghijklmnopqrstuvwxyzabcd凯撒大帝加密解密函数代码如下enciypt加密函数,参数mw为待加密的字符串,pos为向右移动位数;decrypt解密函数,参数同encrypt函数def decryptmmw,pos:mw=for chin mmwif ch=a andch=zmw+=chrordch-97+26-pos%26+97elsemw+=ch returnmw clefencrypt mw,pos:mmw=for chin mwif ch=a andch=zmmw+=chrordch-97+pos%26+97elsemmw十=ch returnmmw实例1某加密算法描述如下⑴若明文是小写字母,则转换成对应密文字符;2若明文是大写字母,则转换为对应小写字母对应的密文字符;⑶明文中其余字符不进行转换,按原字符显示诸城入珈文字符巾:Hello Evervone思路枚举明文字符串,规则算法描述的步骤逐个加密分I%[[T%A%UT;%大写字母,小写字母和其它字符分别进行加密代码如下mwb=zz abcdefghijklmnopqrstuvwxvzz/mmb=ZZ W@*!%GNICEX[};T#AAMBUO mingwen=input请输入明文字符串:\nresult=for chin mingwenif ch=a andch=zmw=mmb[ordch-97]result+=mw elif ch=A andch=Zupper=chrordch+32mw=mmb[ordupper-97]result+=mw elseresult+=ch printresult实例2二进制字符串压缩输入包含1和的字符串,程序将对其压缩压缩方法是取二进制字符串的首字符为压缩后的第11n loooii11iiooooooioooooono15/3/6/6/1/6/2/1一个符号,接着统计首字符的个数,二者连接后再连接一个分隔符“/,接着是另一个连接字符的个数,再是分隔符“/”,……以此类推程序如下strs=input请输入字符串:\n firstch=strs[
0.result=firstch c=1for iin ranged,lenstrsif strs[i]==firstch:c+=1elseresult=result+〃〃+str c+“/1c=1firstch=strs[i]ifc0:result十=str cprintresult练习
①【浙
2015.10选17】某数据加密方法描述如下I以字节为单位进行加密处理;II将1个字节的8位二进制数分割成前4位与后4位两个二进制数;III分别将上述两个4位二进制数转换为十进制数;IV将每个十进制数转换为1个加密字符,对应的“密码表”如下值(十进制)0123456789101112131415加密字符I1•1k eC HN P0s tc ar d小明按照上述方法,设计了一个字符串(仅包含ASCH字符)加密的程序下表显示了字符串中一个字符的加密过程一转换前字符m+字符m的ASCII码十进制值一对应的二进制数一分割、转换后的十进制数-对应的加密字符This isan example!CeHPHONkiIHONkiIHlHriIHCNPHlHaNIHcHC il
②某字符串(字节数是3的倍数)的加密规则如下I将该字符串内码分成3个字节一组,顺次连接后得到24位二进制数II将得到的24位二进制数按每6位一组分成4组,每组6位III在每组数字前补上2个0,得到4个字节的二进制数IV将
③得到的4个二进制数分别转换为十进制数V将得到的每1个十进制数转换为1个加密字符,对应的“密码表”按数值由小到大依次为〃ABCDEFGHIJKLMN0PQRSTUVWXYZabcdefghijklnmopqrstuvwxyz0123456789+/〃
③某字符串加密算法如下(仅限ASCII码),对明文中每个字符如下处理:输入待加密的字符币:I将该字符串内码转换成2位十六进制数Answer14E637775627n将两位十六进制数互换位置,得到的数就是该字符的加密后的字符第八讲“数”问题
8.1质数质数又称素数,指在一个大于1的自然数中,除了1和此整数自身外,没法被其他自然数整除的数
1.质数的判断自然数n,只有1和本身能整除,其它都不能整除,该数就是质数;利用数学知识可以将判断的条件改为[2,intn**
0.5+1]def primenif n=1:return Falsefor iin range2,int n**
0.5+1:if n%i==0:return Falsereturn True
2.输出100以内的质数思路1枚举100以内的每个数,若是质数,则输出该数def primenif n=1:return Falsefor iin range2,int n**
0.5+1:if n%i==0:return Falsereturn Truec=0for iin range2,101:if primei:print i思路2埃拉托斯特尼筛法先把N个自然数按次序排列起来1不是质数,也不是合数,要划去第二个数2是质数留下来,而把2后面所有能被2整除的数都划去2后面第一个没划去的数是3,把3留下,再把3后面所有能被3整除的数都划去3后面第一个没划去的数是5,把5留下,再把5后面所有能被5整除的数都划去这样一直做下去,就会把不超过N的全部合数都筛掉,留下的就是不超过N的全部质数程序代码如下两种代码代码1代码2pt=[True]*100for pin range2,100:pt=[True]*100if pt[p]:res=口for iin rangep*p,100,p:pt[i]for pin range2,100:二False if not pt[p]continue res.append pfor iin range2,lenpt:for iin rangep*p,100,p:pt[i]=if pt[i]False Jprint iprint筛选法求得的素数为,res print个数,,ienres练习
①输出100以内的挛生素数,挛生素数是指2个素数相差2
②编写程序实现将偶数拆分成两素数之和
8.2最大公约数最大公因数,指几个整数中公有的约数,其中最大的一个,叫做这几个数的最大公约数例如
12、16的公约数有
1、
2、4,其中最大的一个是4,4是12与16的最大公约数,一般记为12,16=
412、
15、18的最大公约数是3,记为12,15,18=3求最大公约数有多种方法,常见的有质因数分解法、短除法、辗转相除法、更相减损法方法1枚举法求两数a,b num为a,b中较小者的最大公约数,步骤如下
①用a,b去整除num,若两数都能整除,则输出num并结束,否则转
②②num减1,当num=l,输出最大公约数1,否则转
①程序代码def gcdlnuml,num2:num=minnuml,num2i=num whilei=1if numl%i==0and num2%i==0:rst=i breakelsei-=1return rst方法2质因数分解法把每个数分别分解质因数,再把各数中的公有质因数提取出来连乘,所得的积就是这几个数的最大公约数例如求24和60的最大公约数,先分解质因数,得24=2X2X2X3,60=2X2X3X5,24与60的全部公有的质因数是
2、
2、3,它们的积是2X2X3=12,所以,24,60=12〃“〃因数分解〃〃〃def fjysnum:rst=匚i=2while num1:while num%i==0:rst.appendi num=num//ii+=1if lenrst==1:rst.append1returnrst〃“〃质因数分解法def gcd2numl,num2:gcd2=1nl=fjysnuml n2=fjysnum2for iin nl:if iin n2:n
2.removei gcd2*二i returngcd2方法3辗转相除法辗转相除法是求两个自然数的最大公约数的一种方法,也叫欧几里德算法步骤如下:s=abcdefghabcd”#字符串长度n=lens first=#字符串第1个字符串s[
0.#最后1个字符串last=s[-l.last=s[n-1]#最后1个字符串strs=s
[5]strs#第5个字符串=s[2:
5.#第3个开始到第5个字符串strs=s[::2,#取从头开始每隔2个字符小练习
①写出计算一个三位整数x的各位数之和的python表达式
②根据18位身份证号码sfz,写出计算年龄的python表达式
③写出以一个三位数x开头的对称数的python表达式,如x=123,则输出123321
④写出以n位字符串s开头的长度2n-l位的对称字符串的python表达式,如s=〃abcdef〃,则输出〃abcdef edcba”
①求numl除以num2的余数r;
②当r==0,则输出最大公约数num2并结束,否则,转到
③;3num2赋值numl,r赋值num2,再求numl除以num2的余数r;转到
②;代码如下def gcd3numl,num2:r=numl%num2while r!=0:numl=num2num2=rr=numl%num2return num2练习
①完全数,它所有的真因子即除了自身以外的约数的和,恰好等于它本身编写程序找出1000以内的完全数
②将整数n分解质因数,如36=2*2*3*3
③用96朵红花和72朵白花做花束,如果每个花束里的红花朵数都相等,每个花束里的白花的朵数也都相等,请编写程序计算每个花束里最少有几朵花
8.3斐波那契数列斐波那契数列Fibonacci sequence,又称黄金分割数列、因数学家列昂纳多•斐波那契Leonardoda Fibonacci以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列
1、
1、
2、
3、
5、
8、
13、
21、
34、……在数学上,斐波纳契数列以如下被以递推的方法定义Fl=l,F2=l,Fn=Fn-l+Fn-2n=3,n£N*在现代物理、准晶体结构、化学等领域,斐波纳契数列都有直接的应用求斐波那契数列第n项的实现方法有递归,递推,生成器等方法1递推法def fib_loopn:ab=0^1for iin range2,n+l:a»b=ba+b returnb for iinrangel ll:print fib_loopi end=],递推法,时间复杂度是0n,呈线性增长,如果数据量巨大,速度会越拖越慢方法2生成器def fibgenn:a,b=0,1for iin rangelJn+l:aJ b=b/a+b yielda for iinfib_gen10:printi带有yield的函数都被看成生成器,生成器是可迭代对象,可以遍历获取元素方法3递归法def fibn:ifn=1:return nreturn fibn-1+fibn-2写法最简洁,但是效率最低,会出现大量的重复计算为了解决重复计算的问题,可以用列表记录斐波那契数列每一项的数据,若没有计算过的,则调用递归计算,否则直接使用这避免了用递归法求数列时重复计算的问题程序代码如下方法4递归改进法num=[-1for iinrange16]def fib3n:ifn==0:return0ifn==1:return1if num[n]==-1:num[n]=fib3n-1+fib3n-2return numfn]练习
①有一段楼梯有10级台阶,规定每一步只能跨一级或两级,要登上第10级台阶有几种不同的走法?第九讲约瑟夫问题现实生活中经常有重复的事物,比如每周7天从星期一到星期天循环,计时的秒数从1到60重复等等接下来讲解如何利用取余法生成循环序列
1.生成循环序列
①输入n,生成50个的0--n-l的循环序列,如下图生成0-6的循环序列编号I1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|…|数据01234560123456c1…思路本序列是0-6之间循环变化,可以用7的余数%7,而7的余数的序列是1,234,5,6,0,1,2…,与目标序列不一样,仔细观察,如果将该序列向右移动1位的话就变成了目标序列应用数学知识,向右移动,相位减法操作因此,目标序列的表达式是i-l%7程序代码n=int input「请输入1个整数“s=for iinrange1,50:s+=st ri-1%n prints
②数字按步长移位输入一个由阿拉伯数字构成的字符串,输入请输入0-9之间的数个0123456789移动步长整数n,实现每个数字按0,1,234,5,6,7,8,9的顺序往清输入移动的步长44567890123后移n位例如输入字符串158〃,n=4,即最终结果”592〃思路本题原有的序列是0,1,2,9,0•一,后移n位后的序列,相当于将原有序列左移n位,因此,只需将原有序列的表达式i%7,变为i+n%7即可程序代码如下strs=input请输入0-9之间的数字\n〃step=int input请输入移动加步K\rT result=for iin strsresult+=str inti+step%10print result2约瑟夫环问题约瑟夫环约瑟夫问题是一个数学的应用问题,下面举例介绍
①狐狸追兔子绕圈圈问题山顶一圈有10个山洞,编号为
1、
2、
[0]*11id=0for iin ranged,1001id=id+i%10if id=0id=10flagLid]=1for iin ranged,11if notflagEi]printi思路2本题可以看做是
1、
2、…
9、10这样的1个循环序列,对应的表达式为id-1%10+1,下一次狐狸进入的洞口的表达式id+i-1%10+1程序代码如下flag=
[0]*11id=0for iin ranged,1001:id=id+i-1%10+1flagLid]=1for iin ranged,11:if notflagEi]:printi
②n个人手拉手站成一圈,从第1个人开始报数,报到m的人退出圈外,然后从他的下一个人重新报数,依次输出出圈的人的编号和最后1个幸运者思路1定义一个列表flag表示当前人是否出列情况,0表示出列,1表示未出列,每次报数就是找m个未出列的人,并把报数m的人的flag设置为0,表示出列def ysf n,m:id=0for iin rangenlc=0while cmid=id%n+1if flagLid]c+=1flagLid]=0print第{}次出列的人的编号{}.format i+1,id n=int input—请播入n个人”m=int input〃掖旬m的人出列〃flag=El]*n+1ysfn,m for iin ranged,n+1:if flagEi]:print〃最后出列的编号”,i运行结果可输入n个人8报到m的人出列3第1次出」列的人的编号3第2次出列的人的编号6第3次出列的人的编号1第4次出列的人的编号5第5次出列的人的编号2第6次出列的人的编号8第7次出列的人的编号4最后出列的编号7思路2用列表num[i]存储当前人的下一个报数的人的编号,做n-1次报数,每次报niT,将mT当前位置列表num的值输出(出列的人),然后替换为下一个报数人的值以n=5,m=2为例讲解,如下图,num[l]=2表示1号人的下一个要报数人的编号为2num
[5]=l num[l]=2num
[2]=3num
[4]=5num
[3]=4num
[3]=4从num
[5]=l,开始报数,num[l]存放的初始情况编号是需要出列的人,修改num[l]为num[l]的下一个编号,如上图修改num
[3]=5,即4出列修改num
[5]=3,即1出列修改num
[3]=3,即5出列程序代码如下num=
[0]*n+1print-*50def ysf2n,m:for iin ranged,n+1numEi]=i%n+1p=n foriinrangen-lfor jin ranged,mp=num[p]print〃第{}次出列的人的编号{}.format i+1,numEp]num[p]=num[num[p]]print C最后出列的5号”,num[p]ysf2n,m运行结果如下第1次出列入的编号2第2次出列入的编号4第3次出列入的编号1第4次出列入的编号5最后出列入的编号3练习
①输入一串字符串只含字母,输入向后移动的位数H1,输出该移位后的字符串比如输入〃abcdef”,m=2,则输出cdefgh”
②推算星期几输入今天是星期几,输出num天后是星期几
③猴子选大王一群猴子都有编号,编号是b2,
3...m,这群猴子in个按照1-m的顺序围坐一圈,从第一只猴子开始报数,报到单数的猴子就要离开,这样循环报数,依次下来,直到圈中只剩下最后一只猴子,即为大王
④平面上有N3〈NW100个房间围成一圈,按顺时针方向分别编号为1…N,相邻的两个房间之间均有一扇门,第i个房间居住人数为ai初始时选择一个房间,将所有人都聚集在该房间,接着每个人都按顺时针方向走到相邻的房间,直到走到居住的房间一个人每经过一扇门花费1能量,请确定初始房间,使得所有人花费的能量和最小例如N二5,al=4,a2=7,a3=8,a4=6,a5=4,最佳方案:初始时所有人聚集在2号房间,花费的能量和7*0+8*1+6*2+4*3+4*4=48第二讲最值问题最值指在一个数据范围中的最大值或最小值比如2500名学生成绩数据中找出成绩最好的学生;在一段字符串中找出最大的字符等等L求最值一般的思路
①假定第一个数据最大并赋值给Maxx;
②取出下一个数与最大值Maxx比较,若大于最大值Maxx,则更新最大值Maxx,直到枚举完所有数据;
2.求最值程序模板Maxx=List
[0]#List为数据集合for itemin List[1:]:if itemMaxx:#第2个元素开始枚举数据Maxx=item#取出的数据大于Maxx的更新Maxx
3.实例讲解输入一串字符串,输出该字符串中最大的字符思路该问题是最值问题,可以直接应用求最值的程序模板,代码如下:strs=input输入一串字符串\n#strs字符串maxchar=strs
[0]for#字符串strs的第1个字符赋值给maxchar chin strs[l]:#第2个元素开始牧举字符串if chmaxchar#取}11的字符大于maxchar则更新maxchar maxchar=ch printmaxchar
4.python方法求最值python中提供了函数max,min分别求最大值,最小值max函数原型max/terable,*[,key,defaul参数表示可迭代对象,数据集合函数功能取传入的多个参数中或可迭代对象元素中的最大值min函数原型min/ter able,key,defaul t\参数era4e,表示可迭代对象,数据集合函数功能取传入的多个参数中或可迭代对象元素中的最小值举例如下»max1,2,3,4,5,6,7,88max Czhejiangpujiangpujiangschoolz»max False,True True上述实例,可以利用max函数实现,代码为maxchar=maxstrs练习
①输入批量数据,编程输出该批量数据中的最大值,最小值
②输入一个三位数,将该数各位上的数字重新排列得到新整数,求最大整数和最小整数
③输入一个正整数,将该数各位上的数字重新排列得到新的整数,求最大整数和最小整数第三讲累加专题
3.1数值累加《道德经》“九层高台,起于累土”累积累,叠加力口增加累加在原有基础上添加我们讲累加是指批量数据做加法运算根据数据类型的不同,分数值累加和字符串累加两类问题进行讲解本节介绍数值累加
1.问题引入
①计算s=l+2+3的和我们可以按如下分步运算5二0s=s+l s=s+2s=s+3经过以上4个步骤,可以得到s的结果
②如果计算s=l+2+3+…+100呢,也可以分步完成s=0s=s+l s=s+2s=s+100如何将上述计算过程转化为程序代码呢?编程也可以像数学上的提取公因数法,取出每个语句的公共部分,然后加上不同的部分来写代码s=s4/\n S=S+X x的值在1川之间上述的100n=100条语句可以简化为一条语句s=s+x,然后让x在[1,n]之间逐一枚举要实现[l,n]之间逐一枚举,可以使用for语句和range对象实现因此计算s=l+2+3+...+100的代码可以如下s=0foriin ranged,101s+=iprint s
2.数值累加模板累加程序的代码可以用以下通用模板写程序也可以用模板,简化写程序的过程n=101#累加元素的个数s=0#累加结果变量初始化为0foriin ranged,n#枚举的宥的数据范围s=s+X#将在累加的每1个数据X累加到结果s中prints#播出结来s在该模板中,程序将实现n个X的累加;X是每一个需要累加的数据,可以用python表达式表示,累加程序关键是变量X如何表达
3.python方法实现累加python使用函数sum函数累加该函数的原型如下sumiterable[,start]参数说明iterable一可迭代对象,如列表、元组、集合start-指定相加的参数,如果没有设置这个值,默认为0返回值计算结果
4.实例讲解
①编程实现计算s=l+l/2+l/3+…1/n的值n〈=100本问题是n个数相加的问题,可以应用累加模板,计算范围是变量X=1/io因此该问题可以写成如下代码n=100s=0#累加纳果变量初始化为0foriin ranged,n+1#枚举麻宥的数搪范围X=1/i#待累加的数据X s十二X#将待累加的每1个数据X累加到结果s中prints#输出结果s[pythonic]利用函数sum计算累加,构造好迭代对象即可s=sum[l/k fork inrange1,n+1],其中[1/k fork inrange1,n+1]为列表生成式,该表达式生成列表[1,1/2,1/3,..,1/n]o
②编程实现s=l+3+5+…+n n=100本问题是n个数相加的问题,可以应用累加模板,计算范围是变量x是范围中的奇数代码如下n=100s=0#累加苗果变量初始化为0foriin ranged,n,2#枚举所宥的数据范围s+二i#将待累加的每1个数据X累加到结果s中prints#输出结果s[pythonic]先生成迭代对象,再利用函数sum求和[k fork inrange,n,2]该列表生成式生成[1,3,5,…]范围内的奇数代码如下s=sum[k fork inranged,n,2]练习
①编程计算s=l+l+2+l+2+3+…+1+2+3…+n n=10000o
②编程计算s=1-2+3-4+…+nn〈=10000
③编程实现100以内能被3整除数的和
3.2字符串累加字符串累加是指批量字符串前后连接起来,生成新的字符串
1.问题引入
①输入5,屏幕上显示12345”本题的结果是将数据123,4,5前后拼接得到,这是字符串的累加按1,234,5的先后顺序将数据累加最先出现的1在最前面,最后出现的5在最后面这就像排队时,先来的人排在前面,后来的人排在后面我把它称为“排队累加”代码如下S=foriinranged,6:s=s+str iprints运行结果如下:。