python100例题-python练习集100题(21-40)

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

for i in first_list: #i是a的对手,j是b的对手,k是c的对手

for j in first_list:

if(j!=i):

for k in first_list:

if(k!=i)and(k!=j):

if(i!='x')and(k!='x')and(k!='z'):

print('a pk %s,b pk %s,c pk %s' %(i,j,k))

输出结果:

a pk z,b pk x,c pk y

题目22:有一分数序列:2/1,3/2,5/3,8/5,8/13,21/13...求出这个序列的前20项之和。def denominator(n): #定义分母

if n==1:

return 1

elif n==2:

return 2

else:

return denominator(n-1)+denominator(n-2)

sum_list=0

for i in range(1,21):

sum_list +=denominator(i+1)/denominator(i)

if i==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个字符,以相反顺序打印出来。def reverse_string(i):

if i==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)

输出结果:

请输入字符串:abcdefghijk

kjihgfedcba

题目24:有5个人坐在一起,问第五个人多少岁?她说比第四个人大2岁。问第四个人岁数,他说比第三个人大2岁。问第三个人,他又说比第二个人大2岁。问第二个人,说比第一个人大2岁。问最后一个人,她说是10岁。问第五个人多少岁。def get_age(num): #递归计算

if num==1:

return 10

else:

return 2+get_age(num-1)

var_gae=get_age(5)

print('第一个人的年龄为:%d' %var_gae)

输出结果:

第一个人的年龄为:18

题目25:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。def rever_num(num): #递归输出

if num==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:《算经》中有这样一个问题:今有鸡翁一,值钱伍;鸡母一,值钱三;鸡鶵三,值钱一。凡百钱买鸡百只,问鸡翁、母、鶵各几何?for i in range(21): #i代表公鸡

for j in range(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只,小×××1只

公鸡12只,母鸡 4只,小×××4只

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

if n==1:

print('%s--->%s' %(x,z)) #当只有最后一个盘子时,a--->c

else:

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--->c

a--->b

c--->b

a--->c

b--->a

b--->c

a--->c

题目28:一年一度的欧洲杯比赛已经落幕,在其初赛阶段采用循环制,设有n队参加,初赛共进行n-1天,每对要求和其他各队进行一场比赛,然后按照最后积分选拔进入决赛的球队。要求每对每天只进行一场比赛,并且不能轮空。请安排比赛赛程。a=[[0 for col in range(9)] for row in range(9)] #创建二维列表

def gamecal(k,n): #处理编号k开始的n个球队

if n==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)

for i in range(k,k+n//2):

for j in range(n//2+1,n+1):

a[i][j]=a[i+n//2][j-n//2]

for i in range(k+n//2,k+n):

for j in range(n//2+1,n+1):

a[i][j]=a[i-n//2][j-n//2]

j=2

m=int(input('参赛球队数:'))

for i in range(2,9):

j=j*2

if j==m :

break

if i>=8:

print('参赛对数必须为2的整数次幂,并且不超过64')

gamecal(1,m)

print('编号',end=' ')

for i in range(2,m+1):

if i==m:

print('%2d天' %(i-1))

else:

print('%2d天' %(i-1),end=' ')

for i in range(1,m+1):

for j in range(1,m+1):

if j==m:

print('%4d' %a[i][j],end=' ')

else:

print('%4d' %a[i][j],end=' ')

print(end=' ')

参赛球队数:8

编号 1天 2天 3天 4天 5天 6天 7天

1 2 3 4 5 6 7 8

2 1 4 3 6 5 8 7

3 4 1 2 7 8 5 6

4 3 2 1 8 7 6 5

5 6 7 8 1 2 3 4

6 5 8 7 2 1 4 3

7 8 5 6 3 4 1 2

8 7 6 5 4 3 2 1

题目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]

def exchange(n):

for i in range(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))

for i in range(max_num):

if num[i]>0:

print('%6.2f:%d张' %(parvalue[i]/100,num[i]))

请输入要找零金额:85.9

85.90 元零钱的组成:

50.00:1张

20.00:1张

10.00:1张

5.00:1张

0.50:1张

0.10:4张

题目30:八皇后问题,在8*8的国际象棋上摆放八个皇后,使其不能相互***,即任意两个皇后都不能处于同一行、同一列或同一对角线上。solution=[x for x in range(8)] #声称数组,每个元素代表每一行皇后应摆放的位置

N=8

sols=0

def place(row,col):

for j in range(row): #错误摆放方式

if (row - j == solution[row]-solution[j]) or (row + solution[row]==j+solution[j]) or (solution[j]==solution[row]):

return 0

return 1

def backtrack(row):

global sols #方法总数

if(N==row):

sols +=1

for k in range(N):

if k==N-1:

print('%d ' %solution[k])

else:

print('%d ' %solution[k],end='')

else:

for i in range(N):

solution[row] =i

if(place(row,i)):

backtrack(row+1)

def queens():

backtrack(0)

queens()

print('共有方案:%d' %sols)

输出结果:

...

6 4 2 0 5 7 1 3

7 1 3 0 6 4 2 5

7 1 4 2 0 6 3 5

7 2 0 5 1 4 6 3

7 3 0 2 5 1 6 4

共有方案:92

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

NUM= 29 #组成×××的数字

num=[x for x in range(NUM)] #29个数字

lottery=[x for x in range(MAXN)] #每一注×××的号码

def combine(n,m):

for i in range(m,n+1).__reversed__():

lottery[m-1]=num[i-1] #保存一位数字

if(m>1):

combine(i-1,m-1)

else: #m为1时输出一注号码

for j in range(0,MAXN).__reversed__():

if j==0:

print('%d ' %lottery[j])

else:

print('%d ' %lottery[j],end='')

for i in range(NUM):

num[i]=i+1

for i in range(MAXN):

lottery[i]=0

combine(NUM, MAXN)

输出结果:

...

29 27 24 20 16 13 3

29 27 24 20 16 13 2

29 27 24 20 16 13 1

29 27 24 20 16 12 11

29 27 24 20 16 12 10

29 27 24 20 16 12 9

29 27 24 20 16 12 8

29 27 24 20 16 12 7

...

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

num=int(input('请输入数字:'))

if num <0:

print('输入的数字应该为正数')

else:

x0=num/2

x1=(x0+num/x0)/2

while True:

x0=x1

x1=(x0+num/x0)/2

if(math.fabs(x0-x1)>=1e-6):

break

print('计算结果:%f' %x1)

print('公式计算结果 %f' %math.sqrt(num))

输出结果:

请输入数字:2

计算结果:1.416667

公式计算结果 1.414214

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

n=randint(1,100)

print('生成随机数为%d' %n)

i=0

while True:

num=int(input('输入你猜的数字1-100:'))

i+=1

if(num>n):

print('错误,数字太大了!')

elif(num

print('错误,数字太小了!')

else :

print('回答正确')

break

print('一共猜了 %d 次。' %i)

if i<=5:

print('你太聪明了,这么快猜了出来!')

else:

print('还需要改进方法,以便更快才出来!')

输出结果:

生成随机数为47

输入你猜的数字1-100:50

错误,数字太大了!

输入你猜的数字1-100:46

错误,数字太小了!

输入你猜的数字1-100:47

回答正确

一共猜了 3 次。

你太聪明了,这么快猜了出来!

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

def play(n):

t=0

m=0

for i in range(n):

t=randint(1,6)

m+=t

print(' 第%d粒:%d' %((i+1),t))

print(' 总点数为:%d' %m)

while True:

n=int(input('设置骰子数量(输入0表示退出:)')) #骰子数量

if n==0:

break

c=int(input('输入参赛人数(输入0表示退出:)')) #参赛人数

if c==0:

break

for i in range(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=[[ row for row in range(4)] for col in range(4)]

for i in range(4):

print(list_data[i])

print('-------------------------')

for r_index,row in enumerate(list_data):

for c_index in range(len(row)):

if r_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]=temp

for i in range(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 1num=int(input('输入要生成的杨辉三角行数:'))

triangle=[[ row for row in range(num)] for col in range(num)]

for i in range(num):

triangle[i][0]=1

triangle[i][i]=1

for i in range(2,num):

for j in range(1,i):

triangle[i][j]=triangle[i-1][j-1]+triangle[i-1][j]

for i in range(num):

for j in range(i+1):

if j==i:

print(triangle[i][j])

else:

print(triangle[i][j],end=' ')

输出结果:

输入要生成的杨辉三角行数:10

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1

1 6 15 20 15 6 1

1 7 21 35 35 21 7 1

1 8 28 56 70 56 28 8 1

1 9 36 84 126 126 84 36 9 1

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

print('原列表:',list_a)

b=list_a[num-n:]

print('需要移动的数:',b)

for i in range(num-n):

b.append(list_a[i])

print('移动后的列表:',b)

num=int(input('输入要生成的列表长度:'))

list_a=[x for x in range(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=[x for x in range(1,num+1)]

print(list_num)

quit_num=0 #出圈人数

k=0 #计数3

i=0 #计数数组

while(quit_num

if(list_num[i]!=0):

k+=1

if(k==3): #数到三出局

print('出局者:%d' %list_num[i])

list_num[i]=0

quit_num+=1

k=0

i+=1

if(i==len(list_num)): #数到最后,重新数

i=0

for i in range(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。你知道我所想的那个数是多少吗?for i in range(100,1000):

a=i//100

b=(i%100)//10

c=i%10

sum_num=(a+b+b+c+c)*100+(c+a+c+a+b)*10+b+c+a+b+a

if sum_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 #起始数字

def jud_num(num):

for i in str(num):

set_num.add(i) #原数字组成的集合

for i in range(1,7):

num_i=num*i

for j in str(num_i):

set_numx.add(j) #倍乘后组成的集合

if set_numx.issubset(set_num):

set_numx.clear()

else:

set_numx.clear()

set_num.clear()

return 0

return 1

while True:

ret=jud_num(n)

if ret==1:

print('该数字为:%d' %n)

for i in range(1,7):

print('%d*%d=%d' %(n,i,n*i))

break

n+=1

输出结果:

该数字为:142857

142857*1=142857

142857*2=285714

142857*3=428571

142857*4=571428

142857*5=714285

142857*6=857142

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值