1. 程式人生 > >Python3.7之100個例項(未完)

Python3.7之100個例項(未完)

打了一個月CTF,發覺自己的程式設計能力太弱。
最近重新開始學Python,堅持每天寫幾個例項,順便記錄一下。

目錄

題目1 :三位數計算

有四個數字:1、2、3、4,能組成多少個互不相同且無重複數字的三位數?各是多少?程式分析:可填在百位、十位、個位的數字都是1、2、3、4。組成所有的排列後再去 掉不滿足條件的排列。
程式分析:可填在百位、十位、個位的數字都是1、2、3、4。組成所有的排列後再去 掉不滿足條件的排列。
total=0
for i in range(1,5):
    for j in range(1,5):
        for k in range(1,5):
            if (i!=j) and (i!=k) and (k!=j):
                print(i*100+j*10+k*1)
                total+=1
print("There are "+str(total)+" number fitted.")

題目2:獎金計算

企業發放的獎金根據利潤提成。利潤(I)低於或等於10萬元時,獎金可提10%;利潤高於10萬元,低於20萬元時,低於10萬元的部分按10%提成,高於10萬元的部分,可提成7.5%;20萬到40萬之間時,高於20萬元的部分,可提成5%;40萬到60萬之間時高於40萬元的部分,可提成3%;60萬到100萬之間時,高於60萬元的部分,可提成1.5%,高於100萬元時,超過100萬元的部分按1%提成,從鍵盤輸入當月利潤I,求應發放獎金總數?
程式分析:請利用數軸來分界,定位。注意定義時需把獎金定義成長整型。
Profits=int(input("Please tell me the profit this month:\n"))
arr=[1000000,600000,400000,200000,100000,0]
rat=[0.01,0.015,0.03,0.05,0.075,0.1]
Bonus=0
for i in range(0,6):
    if(Profits>arr[i]):
        Bonus+=(Profits-arr[i])*rat[i]
        print((Profits-arr[i])*rat[i])
        Profits=arr[i]
    else:
        print("0")
print("The Bonus is "+str(Bonus)+"元")

題目3:完全平方數

一個整數,它加上100後是一個完全平方數,再加上168又是一個完全平方數,請問該數是多少?
程式分析:假設該數為 x。
1、則:x + 100 = n2, x + 100 + 168 = m2
2、計算等式:m2 - n2 = (m + n)(m - n) = 168
3、設定: m + n = i,m - n = j,i * j =168,i 和 j 至少一個是偶數
4、可得: m = (i + j) / 2, n = (i - j) / 2,i 和 j 要麼都是偶數,要麼都是奇數。
5、從 3 和 4 推導可知道,i 與 j 均是大於等於 2 的偶數。
6、由於 i * j = 168, j>=2,則 1 < i < 168 / 2 + 1。
7、接下來將 i 的所有數字迴圈計算即可。
for i in range(1,85):
    if 168%i == 0:
        j=168/i
        if (i>j) and ((i+j)%2==0) and ((i-j)%2==0):
            m=(i+j)/2
            n=(i-j)/2
            x=n*n-100
            print(int(x))

題目4:一年中的第幾天

輸入某年某月某日,判斷這一天是這一年的第幾天?
程式分析:以3月5日為例,應該先把前兩個月的加起來,然後再加上5天即本年的第幾天,特殊情況,閏年且輸入月份大於2時需考慮多加一天:
year=int(input("Year:"))
month=int(input("Month:"))
day=int(input("Day:"))
months = [0,31,59,90,120,151,181,212,243,273,304,334]
now=months[month-1]+day
if (year%400==0) or (year%4==0)and(year%100!=0):
    leap=1
else:
    leap=0
if (leap==1)and(month>2):
    now+=1
print("It is "+str(now))

題目5:三數排序

題目:輸入三個整數x,y,z,請把這三個數由小到大輸出。
程式分析:
方法一:我們想辦法把最小的數放到x上,先將x與y進行比較,如果x>y則將x與y的值進行交換,然後再用x與z進行比較,如果x>z則將x與z的值進行交換,這樣能使x最小,,y同樣操作。
x=int(input("x:"))
y=int(input("y:"))
z=int(input("z:"))
min=x
mid=y
max=z
if(x>y):
    temp=y
    y=x
    x=temp
if(x>z):
    temp=z
    z=x
    x=temp
if(y>z):
    temp=y
    y=z
    z=temp
print('order:'+str(x)+' '+str(y)+' '+str(z))

方法二:使用列表方法sort

order=[]
for i in range(0,3):
    x=int(input("Number:"))
    order.append(x)
order.sort()
print("The order from small to big:")
for j in order:
    print(j)

題目6:斐波拉契數列

題目:斐波那契數列。
程式分析:斐波那契數列(Fibonacci sequence),又稱黃金分割數列, 指的是這樣一個數列:1、1、2、3、5、8、13、21、34、……。
在數學上,費波那契數列是以遞迴的方法來定義:
F1 = 1 (n=1)
F2 = 1 (n=2)
Fn = F[n-1]+ F[n-2](n=>2)

方法一:可看成a,b為幽魂附在該數列的最初相鄰的兩個數上(1,1),每迴圈一次,就共同前進一個數字(1,2),(2,3)等等。求的第n個數的話,則a前進n-1次就會附身在那個數上。
def fib(n):
    a,b = 1,1
    for i in range(n-1):
        a,b = b,a+b
    return a
print(fib(100))

方法二:通過公式,進行遞迴(運算時間會較長,不信你試試)

def fib(n):
    if(n==1)or(n==2):
        return 1
    return fib(n-1)+fib(n-2)
print(fib(60))

方案三:如果要求出第n個數時的斐波拉契數列,可以這樣。

def fib(n):
    if(n==1):
        return [1]
    if(n==2):
        return [1,1]
    fibs = [1,1]
    for i in range(2,n):
        fibs.append(fibs[-1]+fibs[-2])
    return fibs
  print(fib(100))

題目7:列表複製

題目:將一個列表的資料複製到另一個列表中。
程式分析:使用列表[:]。
a=[1,2,3]
b=a[:]
print(b)

題目8:九九乘法表

題目:輸出 9*9 乘法口訣表。
程式分析:分行與列考慮,共9行9列,i控制行,j控制列。注意print之後會自動換行,需要用end=' '控制一下。
for i in range(1,10):
    for j in range(1,i+1):
        print(str(i)+'*'+str(j)+'='+str(i*j),end=' ')
    print('\n')

題目9:暫停1秒輸出

題目:暫停一秒輸出。
程式分析:使用 time 模組的 sleep() 函式。
import time
myD={1:'a',2:'b'}
for key,value in dict.items(myD):
    print(key,value)
    time.sleep(1)

題目10:格式化時間

題目:暫停2秒輸出,並格式化當前時間。
import time
print(time.strftime('%Y-%m-%d %H:%M:%S',
              time.localtime(time.time())))
# 暫停2秒
time.sleep(2)
print(time.strftime('%Y-%m-%d %H:%M:%S',
              time.localtime(time.time())))

題目11:兔子生孩子

題目:古典問題:有一對兔子,從出生後第3個月起每個月都生一對兔子,小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數為多少?
程式分析:兔子的規律為數列1,1,2,3,5,8,13,21.... (斐波拉契數列)
def fib(n):
    if(n==1):
        return[1]
    elif(n==2):
        return[1,1]
    fibs=[1,1]
    for i in range(n-2):
        fibs.append(fibs[-1]+fibs[-2])
    return fibs
print(fib(5))

題目12:素數問題

題目:判斷101-200之間有多少個素數,並輸出所有素數。
程式分析:判斷素數的方法:用一個數分別去除2到sqrt(這個數),如果能被整除,則表明此數不是素數,反之是素數。這裡解釋一下:
已知n=(√n)*(√n),假設n=x*y
如果x與y都不是√n,那麼當中必定有一個小於√n,一個大於√n。
所以如果n在(2,√n)不能被整除(不存在那個小於√n的數),那麼在(√n,n)內也一定不能被整除(也不存在對應大於√n的數)。因此只需判斷在(2,√n)就可以了。
from math import sqrt
def prime_judge(n):
    """素數判定"""
    sign=True
    for i in range(2,int(sqrt(n)+1)):
        if(n%i==0):
            sign=False
    return sign

prime_101_200=[]
total=0
for j in range(101,201):
    if(prime_judge(j)):
        prime_101_200.append(j)
        total+=1
print("There are "+str(total)+" prime number.")
print(prime_101_200)