python练习集100题(21-40),python21-40,题目21:两个乒乓球


题目21:两个乒乓球队进行比赛,各出3人。甲队为a,b,c三人,乙队为x,y,z三人。以抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x、z比,请编程找出三队比赛名单。

first_list=[‘x‘,‘y‘,‘z‘]foriinfirst_list:#i是a的对手,j是b的对手,k是c的对手forjinfirst_list:if(j!=i):forkinfirst_list:if(k!=i)and(k!=j):if(i!=‘x‘)and(k!=‘x‘)and(k!=‘z‘):print(‘apk%s,bpk%s,cpk%s‘%(i,j,k))输出结果:apkz,bpkx,cpky

题目22:有一分数序列:2/1,3/2,5/3,8/5,8/13,21/13...求出这个序列的前20项之和。

defdenominator(n):#定义分母ifn==1:return1elifn==2:return2else:returndenominator(n-1)+denominator(n-2)sum_list=0foriinrange(1,21):sum_list+=denominator(i+1)/denominator(i)ifi==20:print(‘%d/%d‘%(denominator(i+1),denominator(i)),end=‘=‘)else:print(‘%d/%d‘%(denominator(i+1),denominator(i)),end=‘+‘)print(sum_list)输出结果:2/1+3/2+5/3+8/5+13/8+21/13+34/21+55/34+89/55+144/89+233/144+377/233+610/377+987/610+1597/987+2584/1597+4181/2584+6765/4181+10946/6765+17711/10946=32.66026079864164

题目23:利用递归函数调用方法,将所输入的5个字符,以相反顺序打印出来。

defreverse_string(i):ifi==string_len-1:#读取到最后一个字符print(input_string[i],end=‘‘)else:reverse_string(i+1)#反向输出print(input_string[i],end=‘‘)input_string=input(‘请输入字符串:‘)string_len=len(input_string)reverse_string(0)输出结果:请输入字符串:abcdefghijkkjihgfedcba

题目24:有5个人坐在一起,问第五个人多少岁?她说比第四个人大2岁。问第四个人岁数,他说比第三个人大2岁。问第三个人,他又说比第二个人大2岁。问第二个人,说比第一个人大2岁。问最后一个人,她说是10岁。问第五个人多少岁。

defget_age(num):#递归计算ifnum==1:return10else:return2+get_age(num-1)var_gae=get_age(5)print(‘第一个人的年龄为:%d‘%var_gae)输出结果:第一个人的年龄为:18

题目25:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。

defrever_num(num):#递归输出ifnum==num_len-1:print(input_number[num],end=‘‘)else:rever_num(num+1)print(input_number[num],end=‘‘)input_number=input(‘请输出数字:‘)num_len=len(input_number)print(‘该数字有%d位‘%num_len)rever_num(0)输出结果:请输出数字:54682该数字有5位28645

题目26:《算经》中有这样一个问题:今有鸡翁一,值钱伍;鸡母一,值钱三;鸡鶵三,值钱一。凡百钱买鸡百只,问鸡翁、母、鶵各几何?

foriinrange(21):#i代表公鸡forjinrange(34):#j代表母鸡k=100-i-j#k代表小鸡数量if(k%3==0)and(i*5+j*3+k/3)==100:print(‘公鸡%2d只,母鸡%2d只,小鸡%2d只‘%(i,j,k))输出结果:公鸡0只,母鸡25只,小鸡75只公鸡4只,母鸡18只,小鸡78只公鸡8只,母鸡11只,小鸡81只公鸡12只,母鸡4只,小鸡84只

题目27:汉诺塔问题,寺院里有3根柱子,第一根有N个盘子,从上往下越来越大。方丈要求小和尚A1把这N个盘子全部移到第三根柱子上,在移动过程中,始终只能小盘子压着大盘子,而且每一次只能移动一个盘子。

defmove(n,x,y,z):ifn==1:print(‘%s--->%s‘%(x,z))#当只有最后一个盘子时,a--->celse:move(n-1,x,z,y)print(‘%s--->%s‘%(x,z))move(n-1,y,x,z)num=int(input(‘输入盘子的数量:‘))print(‘移动%d个盘子的步骤如下:‘%num)move(num,‘a‘,‘b‘,‘c‘)输出结果:输入盘子的数量:3移动3个盘子的步骤如下:a--->ca--->bc--->ba--->cb--->ab--->ca--->c

题目28:一年一度的欧洲杯比赛已经落幕,在其初赛阶段采用循环制,设有n队参加,初赛共进行n-1天,每对要求和其他各队进行一场比赛,然后按照最后积分选拔进入决赛的球队。要求每对每天只进行一场比赛,并且不能轮空。请安排比赛赛程。

a=[[0forcolinrange(9)]forrowinrange(9)]#创建二维列表defgamecal(k,n):#处理编号k开始的n个球队ifn==2:a[k][1]=k#参赛球队编号a[k][2]=k+1#对阵球队编号a[k+1][1]=k+1#参赛球队编号a[k+1][2]=k#对阵球队编号else:gamecal(k,n//2)gamecal(k+n//2,n//2)foriinrange(k,k+n//2):forjinrange(n//2+1,n+1):a[i][j]=a[i+n//2][j-n//2]foriinrange(k+n//2,k+n):forjinrange(n//2+1,n+1):a[i][j]=a[i-n//2][j-n//2]j=2m=int(input(‘参赛球队数:‘))foriinrange(2,9):j=j*2ifj==m:breakifi>=8:print(‘参赛对数必须为2的整数次幂,并且不超过64‘)gamecal(1,m)print(‘编号‘,end=‘‘)foriinrange(2,m+1):ifi==m:print(‘%2d天‘%(i-1))else:print(‘%2d天‘%(i-1),end=‘‘)foriinrange(1,m+1):forjinrange(1,m+1):ifj==m:print(‘%4d‘%a[i][j],end=‘‘)else:print(‘%4d‘%a[i][j],end=‘‘)print(end=‘\n‘)参赛球队数:8编号1天2天3天4天5天6天7天1234567821436587341278564321876556781234658721437856341287654321

题目29:编写程序,实现输入任意金额,可以由100、50、20、10、5、1、0.5、0.2、0.1这几种面额组成。如找零68.9,可以由一张20块、四张10块、一张5块、三张1块、一张0.5、四张0.1组成。

parvalue=[10000,5000,2000,1000,500,100,50,10]#找零的金额*100,方便计算max_num=len(parvalue)num=[0,0,0,0,0,0,0,0]defexchange(n):foriinrange(max_num):if(n>=parvalue[i]):num[i]=n//parvalue[i]n-=parvalue[i]*num[i]input_number=float(input(‘请输入要找零金额:‘))input_number=int(input_number*100)exchange(input_number)print(‘%-6.2f元零钱的组成:‘%(input_number/100))foriinrange(max_num):ifnum[i]>0:print(‘%6.2f:%d张‘%(parvalue[i]/100,num[i]))请输入要找零金额:85.985.90元零钱的组成:50.00:1张20.00:1张10.00:1张5.00:1张0.50:1张0.10:4张

题目30:八皇后问题,在8*8的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后都不能处于同一行、同一列或同一对角线上。

solution=[xforxinrange(8)]#声称数组,每个元素代表每一行皇后应摆放的位置N=8sols=0defplace(row,col):forjinrange(row):#错误摆放方式if(row-j==solution[row]-solution[j])or(row+solution[row]==j+solution[j])or(solution[j]==solution[row]):return0return1defbacktrack(row):globalsols#方法总数if(N==row):sols+=1forkinrange(N):ifk==N-1:print(‘%d‘%solution[k])else:print(‘%d‘%solution[k],end=‘‘)else:foriinrange(N):solution[row]=iif(place(row,i)):backtrack(row+1)defqueens():backtrack(0)queens()print(‘共有方案:%d‘%sols)输出结果:...6420571371306425714206357205146373025164共有方案:92

题目31:假设有一种29选7的彩票,每注由7个1-29的数字组成,且这7个号码不能相同,编写程序生成所有的组合。

MAXN=7#每注彩票的位数NUM=29#组成彩票的数字num=[xforxinrange(NUM)]#29个数字lottery=[xforxinrange(MAXN)]#每一注彩票的号码defcombine(n,m):foriinrange(m,n+1).__reversed__():lottery[m-1]=num[i-1]#保存一位数字if(m>1):combine(i-1,m-1)else:#m为1时输出一注号码forjinrange(0,MAXN).__reversed__():ifj==0:print(‘%d‘%lottery[j])else:print(‘%d‘%lottery[j],end=‘‘)foriinrange(NUM):num[i]=i+1foriinrange(MAXN):lottery[i]=0combine(NUM,MAXN)输出结果:...2927242016133292724201613229272420161312927242016121129272420161210292724201612929272420161282927242016127...

题目32:输入一个数字,使用变成方式求出其平方根是多少。

importmathnum=int(input(‘请输入数字:‘))ifnum<0:print(‘输入的数字应该为正数‘)else:x0=num/2x1=(x0+num/x0)/2whileTrue:x0=x1x1=(x0+num/x0)/2if(math.fabs(x0-x1)>=1e-6):breakprint(‘计算结果:%f‘%x1)print(‘公式计算结果%f‘%math.sqrt(num))输出结果:请输入数字:2计算结果:1.416667公式计算结果1.414214

题目33:用计算机实现一个随机1-100之间的数字,然后由用户猜这个数字,根据用户猜测的次数分别给出不同的提示。

fromrandomimportrandintn=randint(1,100)print(‘生成随机数为%d‘%n)i=0whileTrue:num=int(input(‘输入你猜的数字1-100:‘))i+=1if(num>n):print(‘错误,数字太大了!‘)elif(num<n):print(‘错误,数字太小了!‘)else:print(‘回答正确‘)breakprint(‘一共猜了%d次。‘%i)ifi<=5:print(‘你太聪明了,这么快猜了出来!‘)else:print(‘还需要改进方法,以便更快才出来!‘)输出结果:生成随机数为47输入你猜的数字1-100:50错误,数字太大了!输入你猜的数字1-100:46错误,数字太小了!输入你猜的数字1-100:47回答正确一共猜了3次。你太聪明了,这么快猜了出来!

题目34:模拟算法解决‘掷骰子游戏‘,根据用户输入的骰子数量和参赛人数,由计算机随机生成每一粒骰子的点数,再累加到每一个算首的总数。

fromrandomimportrandintdefplay(n):t=0m=0foriinrange(n):t=randint(1,6)m+=tprint(‘第%d粒:%d‘%((i+1),t))print(‘总点数为:%d‘%m)whileTrue:n=int(input(‘设置骰子数量(输入0表示退出:)‘))#骰子数量ifn==0:breakc=int(input(‘输入参赛人数(输入0表示退出:)‘))#参赛人数ifc==0:breakforiinrange(c):print(‘第%d位选手掷出的骰子为:‘%(i+1))play(n)设置骰子数量(输入0表示退出:)3输入参赛人数(输入0表示退出:)4第1位选手掷出的骰子为:第1粒:3第2粒:6第3粒:2总点数为:11第2位选手掷出的骰子为:第1粒:5第2粒:6第3粒:5总点数为:16第3位选手掷出的骰子为:第1粒:3第2粒:4第3粒:3总点数为:10第4位选手掷出的骰子为:第1粒:6第2粒:4第3粒:2总点数为:12设置骰子数量(输入0表示退出:)

题目35:生成一个4*4的2维数组并将其顺时针旋转90度

list_data=[[rowforrowinrange(4)]forcolinrange(4)]foriinrange(4):print(list_data[i])print(‘-------------------------‘)forr_index,rowinenumerate(list_data):forc_indexinrange(len(row)):ifr_index<c_index:temp=list_data[r_index][c_index]list_data[r_index][c_index]=list_data[c_index][r_index]list_data[c_index][r_index]=tempforiinrange(4):print(list_data[i])输出结果:[0,1,2,3][0,1,2,3][0,1,2,3][0,1,2,3]-------------------------[0,0,0,0][1,1,1,1][2,2,2,2][3,3,3,3]

题目36:打印出杨辉三角形。
1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
1 5 10 10 5 1

num=int(input(‘输入要生成的杨辉三角行数:‘))triangle=[[rowforrowinrange(num)]forcolinrange(num)]foriinrange(num):triangle[i][0]=1triangle[i][i]=1foriinrange(2,num):forjinrange(1,i):triangle[i][j]=triangle[i-1][j-1]+triangle[i-1][j]foriinrange(num):forjinrange(i+1):ifj==i:print(triangle[i][j])else:print(triangle[i][j],end=‘‘)输出结果:输入要生成的杨辉三角行数:1011112113311464115101051161520156117213535217118285670562881193684126126843691

题目37:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数。

defmove_list(n):print(‘原列表:‘,list_a)b=list_a[num-n:]print(‘需要移动的数:‘,b)foriinrange(num-n):b.append(list_a[i])print(‘移动后的列表:‘,b)num=int(input(‘输入要生成的列表长度:‘))list_a=[xforxinrange(num)]move_m=int(input(‘要移动的长度:‘))move_list(move_m)输出结果:输入要生成的列表长度:15要移动的长度:4原列表:[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]需要移动的数:[11,12,13,14]移动后的列表:[11,12,13,14,0,1,2,3,4,5,6,7,8,9,10]

题目38:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。

num=int(input(‘请问一共有多少人:‘))list_num=[xforxinrange(1,num+1)]print(list_num)quit_num=0#出圈人数k=0#计数3i=0#计数数组while(quit_num<len(list_num)-1):if(list_num[i]!=0):k+=1if(k==3):#数到三出局print(‘出局者:%d‘%list_num[i])list_num[i]=0quit_num+=1k=0i+=1if(i==len(list_num)):#数到最后,重新数i=0foriinrange(len(list_num)):if(list_num[i]!=0):print("最后剩下的:%d"%list_num[i])请问一共有多少人:15[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15]出局者:3出局者:6出局者:9出局者:12出局者:15出局者:4出局者:8出局者:13出局者:2出局者:10出局者:1出局者:11出局者:7出局者:14最后剩下的:5

题目39:我们来玩一个数字游戏,我已经想好了一个三位数abc(a是百位,b是十位,c是个位)。并且告诉你acb、bac、bca、cab、cba的和是2012。你知道我所想的那个数是多少吗?

foriinrange(100,1000):a=i//100b=(i%100)//10c=i%10sum_num=(a+b+b+c+c)*100+(c+a+c+a+b)*10+b+c+a+b+aifsum_num==2012:print(i)输出结果:208

题目40:神奇的125874,125874,125874*2=251748,125874和他的两倍251748是由相同的数构成,位置不同而已; 求最小的x,使得x,2x,3x,4x,5x,6x的倍数所组成的数和本身一样。

set_num=set()#原数字组成的集合set_numx=set()#倍乘后组成的集合n=1#起始数字defjud_num(num):foriinstr(num):set_num.add(i)#原数字组成的集合foriinrange(1,7):num_i=num*iforjinstr(num_i):set_numx.add(j)#倍乘后组成的集合ifset_numx.issubset(set_num):set_numx.clear()else:set_numx.clear()set_num.clear()return0return1whileTrue:ret=jud_num(n)ifret==1:print(‘该数字为:%d‘%n)foriinrange(1,7):print(‘%d*%d=%d‘%(n,i,n*i))breakn+=1输出结果:该数字为:142857142857*1=142857142857*2=285714142857*3=428571142857*4=571428142857*5=714285142857*6=857142


本文出自 “随风而飘” 博客,请务必保留此出处http://yinsuifeng.blog.51cto.com/10173491/1906087

python练习集100题(21-40)

相关内容

    暂无相关文章

评论关闭