Python3.7之100個例項(未完)
阿新 • • 發佈:2018-11-16
打了一個月CTF,發覺自己的程式設計能力太弱。
最近重新開始學Python,堅持每天寫幾個例項,順便記錄一下。
目錄
- 題目1 :三位數計算
- 題目2:獎金計算
- 題目3:完全平方數
- 題目4:一年中的第幾天
- 題目5:三數排序
- 題目6:斐波拉契數列
- 題目7:列表複製
- 題目8:九九乘法表
- 題目9:暫停1秒輸出
- 題目10:格式化時間
- 題目11:兔子生孩子
- 題目12:素數問題
題目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)