熟悉Python的各種基礎小演算法
阿新 • • 發佈:2019-01-01
網上有一個Python100小例子的欄目,裡面程式碼良莠不齊,於是下面就自己實現了其中的一些案例。
01.py
# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# __author__ = '郭 璞'
# __date__ = '2016/8/24'
# __Desc__ =
'''
題目:有1、2、3、4個數字,能組成多少個互不相同且無重複數字的三位數?都是多少?
程式分析:可填在百位、十位、個位的數字都是1、2、3、4。組成所有的排列後再去 掉不滿足條件的排列。
'''
source = [1,2,3,4]
for i in range(len(source)):
for j in range(len(source)):
for k in range(len(source)):
if source[i]!=source[j] and source[i]!=source[k] and source[j]!=source[k]:
print source[i],source[j],source[k]
02.py
# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8' )
# __author__ = '郭 璞'
# __date__ = '2016/8/24'
# __Desc__ =
'''
題目:企業發放的獎金根據利潤提成。利潤(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,求應發放獎金總數?
'''
money = int(raw_input('Please input the money:\n' ))
money_list = [1000000,600000,400000,200000,100000,0]
percent_list = [0.01,0.025,0.03,0.05,0.075,0.1]
scholarship = 0
for index in range(0,6):
if money > money_list[index]:
scholarship +=(money-money_list[index])*percent_list[index]
print (money-money_list[index])*percent_list[index]
money = money_list[index]
print scholarship
03.py
# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# __author__ = '郭 璞'
# __date__ = '2016/8/24'
# __Desc__ = 一個整數,它加上100和加上268後都是一個完全平方數,請問該數是多少?
import math
for i in range(1,10000):
x = int(math.sqrt(i+100))
y = int(math.sqrt(i+268))
if (x*x == i + 100) and (y*y == i+268):
print i
04.py
# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# __author__ = '郭 璞'
# __date__ = '2016/8/24'
# __Desc__ = 輸入某年某月某日,判斷這一天是這一年的第幾天?
year = int(raw_input('請輸入年份:\n'))
month = int(raw_input('請輸入月份:\n'))
day = int(raw_input('請輸入日期:\n'))
days = [0,31,59,90,120,151,181,212,243,273,304,334]
result = 0
if 0< month <= 12:
result = days[month]
else:
result = 0
result += day
if year%400==0 or (year%4==0 and year%100!=0):
if month >2 : result +=1
print '%d-%d-%d是今年的第%d天!'%(year,month,day,result)
05.py
# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# __author__ = '郭 璞'
# __date__ = '2016/8/26'
# __Desc__ = 輸入三個整數x,y,z,請把這三個數由小到大輸出。
# ls = []
# for iten in range(0,3):
# ls.append(int(raw_input('請輸入一個數字:\n')))
# ls.sort()
ls = [1,3,6,2,4,8,7,9,0]
target = []
for item in ls:
target.append(item)
target.sort()
print target
print '輸入的資料由大到小的順序為:\n',target
06.py
# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# __author__ = '郭 璞'
# __date__ = '2016/8/26'
# __Desc__ = 輸出9*9乘法口訣表。
for x in range(1,10):
for y in range(1,x+1):
# 原來實現Python2.7print的輸出不換行的關鍵在於句末的一個小逗號啊!!!
print "%d*%d=%d\t"%(x,y,x*y),
print '\n'
07.py
# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# __author__ = '郭 璞'
# __date__ = '2016/8/26'
# __Desc__ = 暫停一秒輸出。
import time
print '一秒後將會處處另一句話!'
time.sleep(1)
print '這就是一秒後的那句話!'
08.py
# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# __author__ = '郭 璞'
# __date__ = '2016/8/26'
# __Desc__ = 古典問題:有一對兔子,從出生後第3個月起每個月都生一對兔子,
# 小兔子長到第三個月後每個月又生一對兔子,假如兔子都不死,問每個月的兔子總數為多少?
ls = [1,1]
for item in range(0,6):
top = ls[-1]
sec_top = ls[-2]
ls.append((top+sec_top))
ls.sort()
for item in range(len(ls)):
print '第%d個月,兔子數量為:%d'%(item+1,ls[item])
09.py
# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# __author__ = '郭 璞'
# __date__ = '2016/8/26'
# __Desc__ = 判斷101-200之間有多少個素數,並輸出所有素數。
def is_sushu(number):
for item in range(2,number):
if number%item==0:
return False
return True
if __name__=="__main__":
for i in range(101,201):
if is_sushu(i):
print i
10.py
# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# __author__ = '郭 璞'
# __date__ = '2016/8/26'
# __Desc__ = 打印出所有的"水仙花數",所謂"水仙花數"是指一個三位數,
# 其各位數字立方和等於該數本身。例如:153是一個"水仙花數",因為153=1的三次方+5的三次方+3的三次方。
# 返回給定數字的水仙花計數值
def return_water_flower_number(number):
ls = []
i = 0
while True:
i = number %10
ls.append(i)
number = (number -i)/10
if number ==0:
break
sum_sum = 0
for item in ls:
sum_sum+=int(item)**3
return sum_sum
if __name__=="__main__":
for i in range(1,10000):
if return_water_flower_number(i)==i:
print i
11.py
# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# __author__ = '郭 璞'
# __date__ = '2016/8/26'
# __Desc__ = 將一個正整數分解質因數。例如:輸入90,打印出90=2*3*3*5。
# 呵呵,這段程式碼我都佩服我自己了,竟然真的可以這麼愉快的執行下去
def fenjie(number):
ls = []
i = 2
while True:
if number%i==0:
ls.append(i)
number = number/i
if number / i == 1:
ls.append(number)
break
else:
i+=1
if number/i ==1:
ls.append(number)
break
return ls
if __name__=="__main__":
num = int(raw_input('請輸入一個數字:\n'))
print "%d的所有質因數是:%d=" % (num,num),
for item in fenjie(num):
print item,'*',
12.py
# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# __author__ = '郭 璞'
# __date__ = '2016/8/26'
# __Desc__ = 求s=a+aa+aaa+aaaa+aa...a的值,其中a是一個數字。例如2+22+222+2222+22222(此時共有5個數相加),幾個數相加有鍵盤控制。
def retravel(number,times):
result = 0
tag = number
for index in range(1,times+1):
result += number
number = number*10+tag
return result
if __name__=="__main__":
number = int(raw_input('請輸入0-9之間的一個數字:\n'))
times = int(raw_input('請輸入要迴圈的次數:\n'))
print '結果是:',retravel(number,times)
13.py
# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# __author__ = '郭 璞'
# __date__ = '2016/8/26'
# __Desc__ = 一個數如果恰好等於它的因子之和,這個數就稱為"完數"。
# 例如6=1+2+3.程式設計找出1000以內的所有完數。
def is_full_number(number):
ls = []
i = 1
for i in range(1,number):
if number %i==0:
ls.append(i)
if i+1== number:
break
else:
continue
summary = 0
for i in ls:
summary +=i
if summary == number :
return True
else:
return False
if __name__ == "__main__":
for i in range(1,10000):
if is_full_number(i):
print i
14.py
# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# __author__ = '郭 璞'
# __date__ = '2016/8/26'
# __Desc__ = 一球從100米高度自由落下,每次落地後反跳回原高度的一半;
# 再落下,求它在第10次落地時,共經過多少米?第10次反彈多高?
def get_total_height(height,times):
total_height = float(height)
temp_height = 0.0
for i in range(1,times):
height = float(height) /2
temp_height = height
total_height+=2*height
return (total_height,temp_height)
if __name__=="__main__":
height = 100.0
times = 10
print "所求高度和為:%d,最後一次落地彈起高度為:%d"%get_total_height(height,times)
15.py
# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# __author__ = '郭 璞'
# __date__ = '2016/8/26'
# __Desc__ = 猴子吃桃問題:猴子第一天摘下若干個桃子,當即吃了一半,還不癮,又多吃了一個第二天早上又將剩下的桃子吃掉一半,又多吃了一個。
# 以後每天早上都吃了前一天剩下的一半零一個。到第10天早上想再吃時,見只剩下一個桃子了。求第一天共摘了多少。
def get_total_peaches(day):
total_peaches = 0
if day == 10:
total_peaches = 1
else:
total_peaches = (get_total_peaches(day+1)+1)*2
return total_peaches
print 'total peaches is:%d'%get_total_peaches(1)
16.py
暫留
# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# __author__ = '郭 璞'
# __date__ = '2016/8/26'
# __Desc__ = 利用遞迴函式呼叫方式,將所輸入的5個字元,以相反順序打印出來。
def append(char):
pass
17.py
# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# __author__ = '郭 璞'
# __date__ = '2016/8/31'
# __Desc__ = 一個5位數,判斷它是不是迴文數。即12321是迴文數,個位與萬位相同,十位與千位相同。
def isHuiWen(number):
arr = str(number)
start = 0
end = len(arr)-1
flag = (end-start)/2
while start <=end :
print arr[start],arr[end]
if arr[start]==arr[end]:
start +=1
end-=1
else:
return False
return True
if __name__=="__main__":
result = isHuiWen(123321)
if result:
print "Yes"
else:
print "NO!"
18.py
# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# __author__ = '郭 璞'
# __date__ = '2016/8/31'
# __Desc__ = 按相反的順序輸出列表的值。
def reverse_print(list):
end = len(list)-1
while end>=0:
print list[end]
end-=1
# 使用系統的內建方法,分片技術
def reverse_slice(list):
for item in list[::-1]:
print item
def reverse(list=[]):
reverse_list = []
end = len(list)-1
while end>=0:
reverse_list.append(list[end])
end-=1
return reverse_list
if __name__ == "__main__":
list = [1,2,3,4,5,6,7,8,9]
# reverse_print(list)
# result = reverse(list)
# for item in result:
# print item,
reverse_slice(list)
19.py
# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# __author__ = '郭 璞'
# __date__ = '2016/8/31'
# __Desc__ = 按逗號分隔列表。
def devide_list(list):
# 這裡的str(item)必須新增,否則會導致字串拼接的型別不匹配的異常
return ','.join(str(item) for item in list)
if __name__ =="__main__":
list = [1,2,3,4,5,6,7]
print devide_list(list)
20.py
# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# __author__ = '郭 璞'
# __date__ = '2016/8/31'
# __Desc__ = 文字顏色設定
# 類似於shell形式的編寫,可以改變終端下字型的顏色,達到一個很好的變成體驗的效果
class bcolors:
HEADER = '\033[95m'
OKBLUE = '\033[94m'
OKGREEN = '\033[92m'
WARNING = '\033[93m'
FAIL = '\033[91m'
ENDC = '\033[0m'
BOLD = '\033[1m'
UNDERLINE = '\033[4m'
print bcolors.OKGREEN + "警告的顏色字型?"+bcolors.UNDERLINE+"第二個顏色顯示"
21.py
# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# __author__ = '郭 璞'
# __date__ = '2016/8/31'
# __Desc__ = 將一個數組逆序輸出。
def reverse_array(arr):
left = 0
right = len(arr)-1
while left <=right:
temp = arr[left]
arr[left]= arr[right]
arr[right]= temp
left+=1
right-=1
return arr
if __name__=="__main__":
arr = ['1',2,3,'Hello']
arr = reverse_array(arr)
print arr
22.py
# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# __author__ = '郭 璞'
# __date__ = '2016/9/1'
# __Desc__ = 交換兩個數的值
# 其實原理都是一樣的,只不過Python可以藉助於tuple,元組的形式來一次性的返回多個值
# 相對於其他程式語言而言,這真的很方便
def change(a,b):
temp = a
a = b
b = temp
return a,b
def exchange(a,b):
a,b = b,a
return a,b
if __name__=="__main__":
a ,b = 1,2
print '原來的值:%d---%d'%(a,b)
a,b = exchange(a,b)
print '值交換後:%d---%d' % (a, b)
c,d = change(a,b)
print '值交換後:%d---%d' % (a, b)
print type(change(a,b))
23.py
# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# __author__ = '郭 璞'
# __date__ = '2016/9/1'
# __Desc__ = 使用lambda來建立匿名函式。關鍵在於lambda表示式緊跟引數,以分號分隔後的表示式只能為算術邏輯表示式,不能有判斷等語句
MAX = lambda x,y: (x>y)*x + (x<y)*y
MIN = lambda x,y: (x<y)*x + (x>y)*y
SUM = lambda x,y: x+y
SUB = lambda x,y: (x>y)*(x) + (x<y)*(y-x)
MUT = lambda x,y:(x!=0)*(x*y) or 0
DIV = lambda x,y: (x*y!=0)*(((float)(x)/(float)(y))) or "除數不能為0!"
if __name__=="__main__":
x = 10
y = 100
print "MAX:",MAX(x,y)
print "MIN:",MIN(x,y)
print "SUM:",SUM(x,y)
print "SUB:",SUB(x,y)
print "SUB:" , SUB(y, x)
print "MUT:",MUT(x,y)
print "DIV:",DIV(x,y)
print "DIV:" , DIV(y, x)
24.py
# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# __author__ = '郭 璞'
# __date__ = '2016/9/1'
# __Desc__ = 輸出一個隨機數。
from random import *
# 返回的是整數
def rand_arrange_in(a, b):
return randint(a, b)
# 返回的不是整數
def rand_uniform(a, b):
return uniform(a, b)
if __name__ == "__main__":
start = 10
end = 28
print "---------------單個數字-------------------------"
print "random int:%d" % rand_arrange_in(start, end)
print "random uniform:%d" % rand_uniform(start, end)
print "---------------多個數字-------------------------"
print "random int:\n"
for item in range(0, 10):
print rand_arrange_in(start, end),
print "\nrandom uniform:"
for item in range(0, 10):
print rand_uniform(start, end),
25.py
# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# __author__ = '郭 璞'
# __date__ = '2016/9/1'
# __Desc__ = 取一個整數a從右端開始的4〜7位。
# 原文的例子是不正確的
"""if __name__ == '__main__':
a = int(raw_input('input a number:\n'))
b = a >> 4
c = ~(~0 << 4)
d = b & c
print '%o\t%o' %(a,d)
"""
# 將所給的數字分解,取後四位
def split1(number):
number = str(number)
result = []
length = len(number)-1
index = length-3
while index<=length:
result.append(number[index])
index+=1
return ''.join(char for char in result)
def split2(number):
# if type(number) == 'str':
# return number[0]
# else:
return int(number) % (10000)
if __name__ == "__main__":
number = 1234567890
print split1(number)
print split2(number)
str_num = str(1234567)
print split2(str_num)
26.py
# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# __author__ = '郭 璞'
# __date__ = '2016/9/1'
# __Desc__ = 使用Tkinter畫同心圓
def circle(width=800,height=600,bg='green'):
from Tkinter import *
# 確定畫布資訊
canvas = Canvas(width=width,height=height,bg=bg)
canvas.pack(expand=YES,fill=BOTH)
k = 1
j = 1
# 確定圓的個數
for index in range(0,32):
# 畫圓需要提供的引數資訊
canvas.create_oval(width/2-k,height/2-k,width/2+k,height/2+k,width=1)
k+=j
j+=0.5
mainloop()
if __name__ =="__main__":
circle(1080,720,'purple')
27.py
# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# __author__ = '郭 璞'
# __date__ = '2016/9/1'
# __Desc__ = 打印出楊輝三角形(要求打印出10行)。
# 本例為原題答案,非原創
if __name__ == '__main__':
a = []
for i in range(10):
a.append([])
for j in range(10):
a[i].append(0)
for i in range(10):
a[i][0] = 1
a[i][i] = 1
for i in range(2,10):
for j in range(1,i):
a[i][j] = a[i - 1][j-1] + a[i - 1][j]
from sys import stdout
for i in range(10):
for j in range(i + 1):
stdout.write(str(a[i][j]))
stdout.write(' ')
print
28.py
# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# __author__ = '郭 璞'
# __date__ = '2016/9/1'
# __Desc__ = 查詢字串。
# 返回第一次出現該子字串的位置,從零開始計數
def find(full_str,sub_str):
return full_str.find(sub_str)
# 採用自定義的"雜湊演算法",其實就是樸素的KMP演算法實現。
# 本來是想把full_str改裝成多個長度和sub_str的字串相等長度的陣列來計算其雜湊和,相等的話作進一步的判斷,但是Python實現起來略顯複雜
def kmp(full_str,sub_str):
sub_length = len(sub_str)
full_length= len(full_str)
for item in range(0,full_length-sub_length):
# 設定 判斷令牌
flag = False
# 對每一個子串進行驗證
for validate in range(0,sub_length):
if full_str[item+validate]==sub_str[validate]:
flag=True
else:
flag = False
# 如果令牌為真,且長度剛好驗證到sub_str的全部長度
if flag and validate==sub_length-1:
return item
if __name__=="__main__":
full = "I am a handsome boy"
sub = " a"
print find(full,sub)
print kmp(full,sub)
29.py
# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# __author__ = '郭 璞'
# __date__ = '2016/9/1'
# __Desc__ = 輸入陣列,最大的與第一個元素交換,最小的與最後一個元素交換,輸出陣列。
#
def swap(arr):
max_index = 0
min_index = 0
max = arr[0]
min = arr[0]
for item in range(len(arr)):
if max<arr[item]:
max = arr[item]
max_index = item
if min > arr[item]:
min = arr[item]
min_index = item
max,arr[0] = arr[0],max
min,arr[len(arr)-1] = arr[len(arr)-1],min
return arr
if __name__ =="__main__":
arr = [1,2,3,4,5,6,7,8,9]
print'交換前:',arr
print '交換後:',swap(arr)
30.py
# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# __author__ = '郭 璞'
# __date__ = '2016/9/1'
# __Desc__ = 有n個整數,使其前面各數順序向後移m個位置,最後m個數變成最前面的m個數
# 將後面的M個數字全部轉到前面,且順序保持不變。利用了列表的分片操作
def shift_right(ls,number):
temp = ls[len(ls)-number:]
ls = ls[0:len(ls)-number]
for item in range(0,len(ls)):
temp.append(ls[item])
return temp
if __name__ == '__main__':
ls = [1,2,3,4,5,6,7]
print shift_right(ls,3)
31.py
# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# __author__ = '郭 璞'
# __date__ = '2016/9/1'
# __Desc__ = 809*??=800*??+9*??+1 其中??代表的兩位數,
# 8*??的結果為兩位數,9*??的結果為3位數。求??代表的兩位數,及809*??後的結果。
if __name__ == '__main__':
a = 809
for i in range(10, 100):
b = i * a + 1
if b >= 1000 and b <= 10000 and 8 * i < 100 and 9 * i >= 100:
print b, '/', i, ' = 809 * ', i, ' + ', b % i
32.py
# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# __author__ = '郭 璞'
# __date__ = '2016/9/1'
# __Desc__ = 某個公司採用公用電話傳遞資料,資料是四位的整數,
# 在傳遞過程中是加密的,加密規則如下:每位數字都加上5,
# 然後用和除以10的餘數代替該數字,再將第一位和第四位交換,
# 第二位和第三位交換。
def decode(number):
ge = number%10
shi = (number%100-ge)/10
bai = (number%1000-10*shi-ge)/100
qian = number/1000
ge,shi,bai,qian= (ge+5)%10,(shi+5)%10,(bai+5)%10,(qian+5)%10
qian,ge = ge,qian
bai,shi = shi ,bai
return qian*1000+bai*100+shi*10+ge
if __name__ == '__main__':
number = 1221
print decode(number)
33.py
# coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding('utf8')
# __author__ = '郭 璞'
# __date__ = '2016/9/1'
# __Desc__ = 列表轉換為字典。
# 系統內建的實現,也即是一個列表對應一個字典項,所以長度當且僅當為2!!!
def build_in(ls_key,ls_value):
# 列表項中的元素資料至多為2兩個
# print dict([ls_value, ls_key])
return dict([ls_key,ls_value])
# 自定義的實現,key集合匹配value集合實現列表轉字典
def my_translator(ls_key,ls_value):
if len(ls_key)!=len(ls_value):
print "鍵值對的長度不匹配!"
exit(0)
dict = {}
for item in range(len(ls_key)):
dict[ls_key[item]]=ls_value[item]
return dict
if __name__ == '__main__':
ls_key = ['x', 'y']
ls_value = [1, 2]
print build_in(ls_key,ls_value)
ls_key.append('z')
ls_value.append(3)
print my_translator(ls_key,ls_value)
總結
案例很簡單,但是確實是程式設計思想的深刻的體現,做完這些小例子,方能感受到基礎知識的重要性。
千萬不要以為某些東西簡單而一掠而過,否則還是會花費更多時間!