python練習集100題(21-40)

題目21:兩個乒乓球隊進行比賽,各出3人。甲隊爲a,b,c三人,乙隊爲x,y,z三人。以抽籤決定比賽名單。有人向隊員打聽比賽的名單。a說他不和x比,c說他不和x、z比,請編程找出三隊比賽名單。python

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位的正整數,要求:1、求它是幾位數,2、逆序打印出各位數字。app

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:《算經》中有這樣一個問題:今有雞翁一,值錢伍;雞母一,值錢三;雞鶵三,值錢一。凡百錢買雞百隻,問雞翁、母、鶵各幾何?dom

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個盤子所有移到第三根柱子上,在移動過程當中,始終只能小盤子壓着大盤子,並且每一次只能移動一個盤子。ide

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、十、五、一、0.五、0.二、0.1這幾種面額組成。如找零68.9,能夠由一張20塊、四張10塊、一張5塊、三張1塊、一張0.五、四張0.1組成。ui

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的國際象棋上擺放八個皇后,使其不能相互***,即任意兩個皇后都不能處於同一行、同一列或同一對角線上。
spa

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
相關文章
相關標籤/搜索