Python--單元四練習


一、算24

 

描述:

 

給出4個小於10的正整數,可以使用加、減、乘、除4種運算以及括號把4個數連接起來得到一個表達式。現在問題是,是否存在一種方式使得所得表達式的結果等於24。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬

 

這里加、減、乘、除以及括號的運算結果和運算優先級跟平常定義一致。‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬

         例如,對於5,5,5,1,可知5×(5-1/5)=24。又如,對於1,1,4,2無論如何都不能得到24

代碼:

 

from itertools import permutations
n1 = input("請輸入第一個數:\n")
n2 = input("請輸入第二個數:\n")
n3 = input("請輸入第三個數:\n")
n4 = input("請輸入第四個數:\n")
n = n1+n2+n3+n4
sum = 1
for i in n:
    sum *= eval(i)
if sum < 24:
    print("NO")
    exit()
notation = ['+', '-', '*', "/"]
st = set()
num = 0
number = set(permutations(n))#將n進行相應的排列組合
for i in notation:
    s = i
    t1 = notation.copy()
    t1.remove(i)#進行一次就去掉一個運算符
    for j in t1:
        s += j
        t2 = t1.copy()
        t2.remove(j)
        for p in t2:
            s += p
            st.add(s)
            s = i+j
        s = i
newst = set()
for i in number:
    for j in st:
        newst.add(i[0]+j[0]+i[1]+j[1]+i[2]+j[2]+i[3])
# print(newst)
all = set()
for i in newst:
    i1 = '('+i[0:3]+')'+i[3:]
    i2 = i[0:2]+'('+i[2:5]+')'+i[5:]
    i3 = i[0:4] + '(' + i[4:] + ')'
    i4 = '(('+i[0:3]+')'+i[3:5]+")"+i[5:]
    i5 = i[0:2]+'(('+i[2:5]+')'+i[5:]+")"
    i6 = '(' + i[0:2] + '(' + i[2:5] + '))' + i[5:]
    i7 = i[0:2]+'('+i[2:4]+'('+i[4:]+"))"
    all.add(i1)
    all.add(i2)
    all.add(i3)
    all.add(i4)
    all.add(i5)
    all.add(i6)
    all.add(i7)
result = []
for i in all:
    try:
        if eval(i) == 24:
          result.append(i)
    except:
        pass
print("YES")
print("("+sorted(result)[0]+")")

 

運行結果:

 

 二、Collatz猜想

 

描述:

Collatz猜想也叫3n+1猜想,給一個正整數,如果是偶數,則減半;如果是奇數,則變為它的三倍加一。直到變為1停止。猜想對於所有正整數經過足夠多次變換最終達到1。

代碼:

 

m=int(input("輸入一個整數:"))
while m!=1:
    if m%2==0:
        m=m/2;
        print('%.1f' %m)
    else:
        m=(3*m+1);
        print('%.1f' %m)

 

運行結果:

 

 三、二分法求平方根

 

描述:

設計一個用二分法計算一個大於或等於 1 的實數 n 的平方根的函數sqrt_binary(n),計算精度控制在計算結果的平方與輸入的誤差不大於1e-6。

代碼:

 

import math
def sqrt_biary(n):
    low=0 #設置下限為0
    high=max(n,1) #設置上限為n和1之中的最大數,即:如果n>=1,那么上限為n;如果n<1,那么上限為1
    guess=(low+high)/2 #先從中間值開始猜
    count=1   #設置猜測次數起始值為1
    while abs(guess**2-n)>(1e-6) and count<100: #當猜測值的平方和n本身的差值無限接近誤差值時,循環才會停止;同時設置猜測次數不超過100次
        if guess**2<n:  #如果猜測值的平方小於n,那么將此設為下限
            low=guess
        else:           #如果猜測值的平方大於n,那么將此設為上限
            high=guess
        guess=(low+high)/2  #根據新的上下限,重新進行猜測
        count+=1            #猜測次數每次增加1
    print(guess) 

m=float(input("請輸入需要計算的數:"))
print("二分法運算結果:")
sqrt_biary(m)
print("庫函數運算結果:\n",math.sqrt(m))

 

運行結果:

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM