題目1: 有四個數字:1、2、3、4,能組成多少個互不相同且無重復數字的三位數?各是多少?
# 正常
num =[]for a inrange(1,5):for b inrange(1,5):for c inrange(1,5):if(a != b and a!= c and b!=c):# if a != b != c 只判斷了a不等于b,b不等于c,沒有判斷a和c的關系 num.append(a*100+ b*10+ c)print(num)# 簡寫:
x =[1,2,3,4]
num =[i*100+ j*10+ k for i in x for j in x for k in x if(j != i and k != j and k != i)]# itertools ,結果需處理 import itertools
num =[]
x=[1,2,3,4]for i in itertools.permutations(x,3):num.append(i)print(num)
題目3:一個整數,它加上100后是一個完全平方數,再加上168又是一個完全平方數,請問該數是多少?
"""
分析:
a + 100 = b**2 + 168 = c**2
168 = c**2 - b**2
因為b小于c,且b,c都屬于168,所以b∈c for c in range(1,168):for b in range(1,c): if c**2-b**2 == 168:a = b**2 - 100print(a)"""
題目4:日期天數計算
題目4:輸入某年某月某日,判斷這一天是這一年的第幾天?
"""
分析:
1. 月份 + 日 = 天數;2.1,4,9,11月 固定30天,3,5,6,8,10,12月 固定31天,2月閏年28天,非潤29天;3. 考慮系統語言計算差會存在1天誤差,所以起始天數為1;defget_days(year,month,day):days =[31,28,31,30,31,60,31,31,30,31,30,31]sum=1# 不能是0,日期從1開始算if year %400==0or(year %4==0and year %100!=0):days[2]= days[2]+1else:days[2]= days[2]for i inrange(month-1):sum+= days[i]returnsum get_days(2021,3,1)
題目18:求s=a+aa+aaa+aaaa+aa...a的值,其中a是一個數字。例如2+22+222+2222+22222(此時共有5個數相加),幾個數相加由鍵盤控制."""
分析:
傳入2個參數
1.總的幾個數相加即最長的長度:len=52.傳入的n 是什么: 如 222222222222222
找規律:2=2*10**0 n =2 冪 =(len-1)22=2*10**1+2222=2*10**2+222222=2*10**3+222
得公式: tmp = n*10**(len-1)+ tmp defget_sum(n,len):sum=0# 輸出和 tmp =0# 分解的值 for a inrange(1,len+1):# a 浮標 = 冪 tmp = n*10**(a-1)+ tmp sum+= tmp returnsum
get_sum(2,5)
題目19:完數判斷
題目19:一個數如果恰好等于它的因子之和,這個數就稱為"完數"。例如6=1+2+3.編程找出1000以內的所有完數。
"""
分析: 同14先找因子 然后 n =sum(因子和)for a inrange(1,1000):sum=0for b inrange(1, a):if a % b ==0:sum+= bifsum== a:print(a)
題目21:猴子吃桃
題目21:猴子吃桃問題:猴子第一天摘下若干個桃子,當即吃了一半,還不癮,又多吃了一個.第二天早上又將剩下的桃子吃掉一半,又多吃了一個。以后每天早上都吃了前一天剩下的一半零一個。到第10天早上想再吃時,見只剩下一個桃子了。求第一天共摘了多少。
"""
分析: 每次1/2+1,倒推即最后剩下的(n+1)*2= n 前一天的即11534/2-1=7662766/2-1=3823382/2-1=1904190/2-1=94594/2-1=46646/2-1=22722/2-1=10810/2-1=494/2-1=1defpeach(rest):rest =1for a inrange(1,11):# 第10天剩1個,實際是第九天吃完后還剩1個 a = 循環天數if a <=9: rest =(rest+1)*2a = a +1else:breakreturn rest
peach(10)
題目24:分數序列求和
題目24:有一分數序列:2/1,3/2,5/3,8/5,13/8,21/13...求出這個數列的前20項之和。
"""
分析:235813211235813
前20項之和首先得得到第20個數是什么,然后每個數相加 defadd_sum(n):# n第幾個數a =1# 分母 b =1# 分子sum=0for i inrange(1,n+1):a,b = b,a+bsum+= b/a returnsum
add_sum(20)
題目28:有5個人坐在一起.問第五個人多少歲?他說比第4個人大2歲。問第4個人歲數,他說比第3個人大2歲。問第3個人,又說比第2人大2歲。問第2個人,說比第1個人大2歲。最后問第一個人,他說是10歲。請問第五個人多大?
"""
分析:
遞歸思想 每前1個人+2歲即可;
age =10for i inrange(1,5):if i <=4:age +=2else: age
print(age)
題目83:求0—7所能組成的奇數個數。
"""
分析:0-7 共8個數,個位奇數為1,3,5,7,2位數及以上首位不可以為0;
則: 組成1位數是4個組成2位數是7*4個組成3位數是7*8*4個組成4位數是7*8*8*4個.... 依次類推 L =[]sum=0for i inrange(1,9):# i等于位數 if i ==1:num =4sum+= numif i >=2:num =4*7*8**(i-2)sum+= num
print(sum)
題目85:9的倍數驗證
題目85:輸入一個奇數,然后判斷最少幾個 9 除于該數的結果為整數。
"""
i =int(input('輸入奇數: '))sum=9whilesum% i !=0:sum=sum*10+9# 循環賦值 print(sum)
題目81:數學等式驗證
題目81:809*??=800*??+9*?? 其中??代表的兩位數,809*??為四位數,8*??的結果為兩位數,9*??的結果為3位數。求??代表的兩位數,及809*??后的結果。
"""
分析:809*ab 四位數 得到ab<=128*ab 兩位數 得到ab<=129*ab 三位數 得到ab>11所以ab =12for i inrange(10,101):if809* i ==800* i +9* i:if8* i <100:if9* i >100and9* i <1000:print(i ,809* i)
二、字符串操作
題目13:水仙花數
題目13:打印出所有的"水仙花數",所謂"水仙花數"是指一個三位數,其各位數字立方和等于該數本身。例如:153是一個"水仙花數",因為153=1的三次方+5的三次方+3的三次方。
"""
// 取整 % 取余
num =[]for n inrange(100,1000):a = n//100b = n//10%10 c = n%10if n == a**3+ b**3+ c**3:num.append(n)print(num)
題目89:某個公司采用公用電話傳遞數據,數據是四位的整數. 在傳遞過程中是加密的,加密規則如下:每位數字都加上5,然后用和除以10的余數代替該數字,再將第一位和第四位交換,第二位和第三位交換。
"""
分析: 即不斷賦值和替換的過程。
n =1234
加5:6789
和/10:6789# 題目表達不清
交換:9876
n =str(input())
a =[]for i inrange(4):a.append((int(n[i])+5)%10)
a[0],a[3]= a[3],a[0]
a[1],a[2]= a[2],a[1]print("".join('%s'%s for s in a))
題目86:兩個字符串連接程序。
"""
a ="Kobe"
b ="24"
c = a + b
print(c)
題目31:星期判斷
題目31:請輸入星期幾的第一個字母來判斷一下是星期幾,如果第一個字母一樣,則繼續判斷第二個字母。
"""
分析:
week=['Monday','Tuesday','Wednesday','Thursday','Friday','Saturday','Sunday']
特殊情況即首字母為T 和S的情況,簡單判斷即可;
fir =input("第1個字母:")if fir =='M':print("周一")elif fir =='W':print("周三")elif fir =='F':print("周五")elif fir =='T':s =input("第2個字母:")if s =='u':print("周二")elif s =='h':print("周四")elif fir =='S':s =input("第2個字母:")if s =='a':print("周六")elif s =='u':print("周日")else:print("輸入錯誤")
題目38:求一個3*3矩陣主對角線元素之和。
"""
分析:1.主對角線元素之和 ---> 知道定義很重要 在一個n階方陣(或是n階行列式)中,從左上角到右下角這一斜線方向上的n個元素所在的對角線,叫做n階方陣(或行列式)的主對角線。
2.設置一個雙重for循環控制輸入二維數組,再將n[i][j]累加后輸出.# 未知矩陣if __name__ =='__main__':a =[]sum=0.0for i inrange(3):a.append([])for j inrange(3):a[i].append(float(input("input num:\n")))for i inrange(3):sum+= a[i][i]print(sum)# 已知矩陣
m =[[1,2,3],[4,5,6],[7,8,9]]sum=0for i inrange(0,3):sum+= m[i][i]print(sum)
題目44:矩陣相加
題目44:兩個 3 行 3 列的矩陣,實現其對應位置的數據相加,并返回一個新矩陣:
"""
X =[[12,7,3],[4,5,6],[7,8,9]]
Y =[[5,8,1],[6,7,3],[4,5,9]]分析: 同38一樣;
z =[]for i inrange(3):z.append([])for i inrange(3):for j inrange(3):z[i].append(x[i][j]+y[i][j])print(z)
題目68:數組循環移位
題目68:有 n 個整數,使其前面各數順序向后移 m 個位置,最后 m 個數變成最前面的 m 個數
"""
分析: 因為總長度不變,即最后一項變為第一個,最后第二個變為整數第二個即a[i]= a[i+m], a[len(a)-1]= a[i]
邏輯和方法對了,其實就很簡單了
a =[1,2,3,4,5,6,7]# 測試列表
m =5# 設置向后移動 3 位for i inrange(m):a.insert(0, a.pop())# pop 剔除默認最后一位,insert加入指定位置指定數;print(a)
題目69:約瑟夫環問題
題目69:有n個人圍成一圈,順序排號。從第一個人開始報數(從1到3報數),凡報到3的人退出圈子,問最后留下的是原來第幾號的那位。
"""
n =[i+1for i inrange(20)]
i =1whilelen(n)>1:if i %3==0:n.pop(0)else:n.insert(len(n),n.pop(0))# 同68 考驗邏輯i +=1print(n)
題目72:創建鏈表
題目72:創建一個鏈表。
"""
l=[input("please input a number:\n")for i inrange(5)]print(l)
題目73:反向鏈表
題目73:反向輸出一個鏈表。
"""
l=[input("please input a number:\n")for i inrange(5)]
l.reverse()print(l)
題目100:列表轉字典
題目100:列表轉換為字典。
"""
# 從列表創建字典
i =['a','b','c']
l =[1,2,3]
b=dict(zip(i,l))print(b)
題目39:數組插入排序
題目39:有一個已經排好序的數組。現輸入一個數,要求按原來的規律將它插入數組中。
"""
分析: 題目其實說的不太明確,所以要挖掘隱藏條件: 已經排好序則代表按順序大小排, 新輸入的數,也需要從小到大排;所以思路整體上就是循環比大小;
a =[1,2,3,5,6,7]
插入數字 4
a.append(4)sorted(a)但顯然題目考察的是希望自己能寫這個邏輯,純循環遇上數字較多的效率會比較低,所以可以折半選取再循環;
a =[1,2,3,5,6,7]
b =4for i inrange(len(a)-1):if b >= a[i]and b <= a[i+1]:a.insert(i+1, b)breakelif i ==(len(a)-2):a.append(b)breakprint(a)
題目67:數組極值交換
題目67:輸入數組,最大的與第一個元素交換,最小的與最后一個元素交換,輸出數組。
"""
分析: 利用下標和max,min即可; a =[1,2,3,4,5]for i inrange(len(a)):if a[i]==max(a):a[0],a[i]=a[i],a[0]# 不可分開寫,否則會變成[6, 3, 4, 5, 6] 先后賦值;if a[i]==min(a):a[len(a)-1],a[i]=a[i],a[len(a)-1]print(a)# 法2
a =[1,3,4,5,6]print(a)# 最小的放到最后min=min(a)
a.remove(min)
a.append(min)# 最大的放到最前面max=max(a)
a.remove(max)
a.insert(0,max)print(a)
題目91:時間函數舉例1。
"""
import time
print time.ctime(time.time())print time.asctime(time.localtime(time.time()))print time.asctime(time.gmtime(time.time()))
題目92:時間函數示例2
題目92:時間函數舉例2。
"""
import time
start = time.time()for i inrange(3000):print(i)
end = time.time()print(end - start)
題目93:時間函數示例3
題目93:時間函數舉例3。
"""
if __name__ =='__main__':import timestart = time.clock()for i inrange(100):print(i)end = time.clock()print('different is %6.3f'%(end - start))
題目94:反應速度測試
題目94:時間函數舉例4,一個猜數游戲,判斷一個人反應快慢。 別看代碼長,其實不難
"""
if __name__ =='__main__':import timeimport randomplay_it =input('do you want to play it.(\'y\' or \'n\')')while play_it =='y':c =input('input a character:\n')i = random.randint(0,2**32)%100print('please input number you guess:\n')start = time.clock()a = time.time()guess =int(input('input your guess:\n'))while guess != i:if guess > i:print('please input a little smaller')guess =int(input('input your guess:\n'))else:print('please input a little bigger')guess =int(input('input your guess:\n'))end = time.clock()b = time.time()var =(end - start)/18.2print(var)# print 'It took you %6.3 seconds' % time.difftime(b,a))if var <15:print('you are very clever!')elif var <25:print('you are normal!')else:print('you are stupid!')print('Congradulations')print('The number you guess is %d'% i)play_it =input('do you want to play it.')
題目23:打印出如下圖案(菱形):*************************"""
defpic(n):for i inrange(0,n):a =abs(i -int(n/2))b = n -abs(i -int(n/2))print(" "*a+"*"*(b-a))
pic(7)
七、算法與數據結構
題目6:斐波那契數列
題目6:斐波那契數列(Fibonacci sequence),又稱黃金分割數列,指的是這樣一個數列:0、1、1、2、3、5、8、13、21、34、……。
"""
從第3個數起,每一個數等于前2個數的和;
num = f(n-1)+f(n-2)(n>=2)defFibonacci_sequence(n):a, b =0,1while n>0:a, b, n = b, a + b, n -1print(a)
Fibonacci_sequence(10)
題目12:素數篩選
題目12:判斷101-200之間有多少個素數,并輸出所有素數。
"""
分析:
判斷素數x方法: 從2-->(x-1)之間能有一個數被整除 則非素數; num =[]for a inrange(101,200):for b inrange(2,a-1):if a%b ==0:breakelse:# 這里位置不能寫錯,不然容易陷入無限循環; num.append(a)print(num)
題目22:兩個乒乓球隊進行比賽,各出三人。甲隊為a,b,c三人,乙隊為x,y,z三人。已抽簽決定比賽名單。有人向隊員打聽比賽的名單。a說他不和x比,c說他不和x,z比,請編程序找出三隊賽手的名單。
"""
分析: 直接可以得出答案,c和y, a和z,b和x ,用變成實現則將判斷邏輯寫下即可;for a in['x','y','z']:for b in['x','y','z']:for c in['x','y','z']:if(a!=b)and(b!=c)and(c!=a)and(a!='x')and(c!='x')and(c!='z'):print('a和%s比賽,b和%s比賽,c和%s比賽'%(a,b,c))法2:
m=['a','b','c']
n=['x','y','z']
L=[]for i inrange(0,3):for j inrange(0,3):L.append(m[i]+n[j])
L.remove('ax')
L.remove('ay')
L.remove('by')
L.remove('bz')
L.remove('cx')
L.remove('cz')print(L)
題目61:楊輝三角生成
題目61:打印出楊輝三角形(要求打印出10行如下圖)。
"""
分析: 首先要理解什么是楊輝三角,這是非常經典的一個題目;11112113311464115101051161520156117213535217118285670562881
楊輝三角的特性:1.第n行的m個數可表示為 C(n-1,m-1),即為從n-1個不同元素中取m-1個元素的組合數。
2.每個數字等于上一行的左右兩個數字之和。可用此性質寫出整個楊輝三角。即第n+1行的第i個數等于第n行的第i-1個數和第i個數之和,這也是組合數的性質之一。即 C(n+1,i)=C(n,i)+C(n,i-1)。defYh_triangles():L =[1]whileTrue:yield LL =[sum(i)for i inzip([0]+L, L+[0])]defYh_triangles(num =10):L =[[1]]for i inrange(1,num):L.append([(0if j==0else L[i-1][j-1])+(0if j ==len(L[i-1])else L[i-1][j])for j inrange(i+1)])return L
題目76:分段函數計算
題目76:編寫一個函數,輸入n為偶數時,調用函數求1/2+1/4+...+1/n,當輸入n為奇數時,調用函數1/1+1/3+...+1/n
"""
# 比較簡單,直接上代碼 defnum(n):sum=0if n%2==0:for i inrange(1,int(n/2)+1):sum+=1/(2*i)returnsumif n%2!=0:for i inrange(1,int((n+1)/2)+1):sum+=1/(2*i-1)returnsum
num(5)# 同理,應用range()的步長會更高效; defnum(n):sum_tmp =[1/i for i inrange(n,0,-2)]returnsum(sum_tmp)
num(4)
題目77:循環輸出列表
題目77:循環輸出列表
"""
ls =['Kobe','24','8']for i inrange(len(ls)):print(ls[i])
題目78:最大年齡查找
題目78:找到年齡最大的人,并輸出。請找出程序中有什么問題。
"""
person_age ={"li":18,"wang":50,"zhang":20,"sun":22}defget_max(dict):max_age =0for key, value indict.items():if value > max_age:max_age = valuename = keyprint(name)print(max_age)
get_max(person_age)
題目8:輸出 9*9 乘法口訣表。
"""
1*1=12*1=22*2=43*1=33*2=63*3=94*1=44*2=84*3=124*4=165*1=55*2=105*3=155*4=205*5=256*1=66*2=126*3=186*4=246*5=306*6=367*1=77*2=147*3=217*4=287*5=357*6=427*7=498*1=88*2=168*3=248*4=328*5=408*6=488*7=568*8=649*1=99*2=189*3=279*4=369*5=459*6=549*7=639*8=729*9=81for a inrange(1,10):for b inrange(1,10):print(str(a),"*",str(b),"=",a*b )
題目9:延時輸出
題目9:暫停一秒輸出。
程序分析:使用 time 模塊的 sleep() 函數。
"""
# 沒有具體要求,能實現延遲即可; import time id=[1,2,3]for i inrange(len(id)):print(i)time.sleep(2)
題目14:質因數分解
題目14:將一個正整數分解質因數。例如:輸入90,打印出90=2*3*3*5。
"""
分析:
要找出全部因數比較容易,第一次寫輸出的是[2,3,5],沒有考慮到重復因子的情況,所以要加while判斷的邏輯;defget_factor(n):print('{} = '.format(n), end=" ")ifnotisinstance(n,int)or n <=0:# 判斷變量是否是已知字段類型, 字符串可迭代 print('請輸入一個正確的數字 !')exit(0)elif n in[1]:print('{}'.format(n))while n notin[1]:# 循環保證遞歸for a inrange(2, n +1):if n % a ==0: n //= a if n ==1:# 這步很重要,判斷關鍵 print(a)else:# index 一定是素數print('{} *'.format(a), end=" ")break
get_factor(10)
題目29:給一個不多于5位的正整數,要求:一、求它是幾位數,二、逆序打印出各位數字。
"""
分析: 本質考察如何拆解字符串
# 最簡單寫法
tmp =input("輸入一個數字")len(tmp)list(tmp)[::-1]# list可拆解字符串str(tmp)[::-1]# str 不拆解# 普通寫法
n =int(input("請輸入一個數:\n"))
a = n%10000# 萬位
b =(n/1000)%10# 千位
c =(n/100)%10# 百位
d =(n/10)%10# 十位
e =(n/1)%10# 個位 if a !=0:print("5 位數:",e,d,c,b,a)elif b !=0:print("4 位數:",e,d,c,b)elif c !=0:print("3 位數:",e,d,c)elif d !=0:print("2 位數:",e,d)else:print("1 位數:",e)
題目36:求100之內的素數。
"""
分析: 第12題做過如何判斷素數,一模一樣;
num =[]for a inrange(1,100):for b inrange(2,a-1):if a%b ==0:breakelse:# 這里位置不能寫錯,不然容易陷入無限循環; num.append(a)print(num)
題目41:模仿靜態變量的用法。
"""
分析: 官方寫法參考
defvarfunc():var =0print('var = %d'% var)var +=1if __name__ =='__main__':for i inrange(3):varfunc()# 類的屬性# 作為類的一個屬性吧classStatic:StaticVar =5defvarfunc(self):self.StaticVar +=1print(self.StaticVar)print(Static.StaticVar)
a = Static()for i inrange(3):a.varfunc()
題目42:自動變量
題目42:學習使用auto定義變量的用法。
"""
分析: 官方寫法參考
num =2defautofunc():num =1print('internal block num = %d'% num)num +=1for i inrange(3):print('The num = %d'% num)num +=1autofunc()