python练习集100题(21-40)

发布时间:2019-09-05 07:04:38编辑:auto阅读(1630)

    题目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='\n')
    参赛球队数: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<n):
            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*42维数组并将其顺时针旋转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 2 1 
    1 3 3 1 
    1 4 6 4 1 
    1 5 10 10 5 1  

    num=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<len(list_num)-1):
        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


关键字