python簡(jiǎn)單實(shí)例訓(xùn)練(21~30)
注意:我用的python2.7,大家如果用Python3.0以上的版本,請(qǐng)記得在print()函數(shù)哦!如果因?yàn)榘姹締?wèn)題評(píng)論的,不做回復(fù)哦!!
21.題目:將一個(gè)正整數(shù)分解質(zhì)因數(shù)。例如:輸入90,打印出90=2*3*3*5。
程序分析:對(duì)n進(jìn)行分解質(zhì)因數(shù),應(yīng)先找到一個(gè)最小的質(zhì)數(shù)k,然后按下述步驟完成:
(1)如果這個(gè)質(zhì)數(shù)恰等于n,則說(shuō)明分解質(zhì)因數(shù)的過(guò)程已經(jīng)結(jié)束,打印出即可。
(2)如果n!=k,但n能被k整除,則應(yīng)打印出k的值,并用n除以k的商,作為新的正整數(shù)你n,重復(fù)執(zhí)行第一步。
(3)如果n不能被k整除,則用k+1作為k的值,重復(fù)執(zhí)行第一步。
注意:要知道 format 這個(gè)函數(shù),其實(shí)就是格式化,與 print 差不多,具體可參考http://www.dbjr.com.cn/article/63672.htm
方法一:只用循環(huán)
# -*- coding: UTF-8 -*- while True: n = input("請(qǐng)輸入一個(gè)數(shù):") #這里有逗號(hào)是為了保證它輸出后不自動(dòng)換行,下同 print '{} = '.format(n), #判斷你輸入的是不是正確格式 if not isinstance(n, int) or n <= 0 : print '請(qǐng)輸入一個(gè)正確的數(shù)字 !' #如果你是輸入的是 1,那只輸出 1 if n in [1] : print '{}'.format(n) while n >= 2: for i in range(2,n + 1): if n % i == 0: n /= i #n 等于 n/i if n == 1: print i , else : # index 一定是素?cái)?shù) print '{} *'.format(i), break print #換行咯
方法二:定義函數(shù)
# -*- coding: UTF-8 -*- def reduceNum(n): print '{} = '.format(n), if not isinstance(n, int) or n <= 0 : print '請(qǐng)輸入一個(gè)正確的數(shù)字 !' exit(0) elif n in [1] : print '{}'.format(n) while n not in [1] : # 循環(huán)保證遞歸 for i in range(2, n + 1) : if n % i == 0: n /= i # n 等于 n/i if n == 1: print i else : # i 一定是素?cái)?shù) print '{} *'.format(i), break reduceNum(100) reduceNum(9)
輸出:
100 = 2 * 2 * 5 * 5
9 = 3 * 3
方法三:用列表 append 函數(shù),這里只是用列表的形式輸出了所有x的因子
# -*- coding: UTF-8 -*- while True: x = input("pls input a number:") ret = [] while x > 1: for v in range(2,x + 1): if x % v == 0: ret.append(v) x /= v break print ret 輸出: pls input a number:9 [3, 3]
說(shuō)明:其實(shí)兩種方法大同小異,沒(méi)什么區(qū)別。
22.題目:求s=a+aa+aaa+aaaa+aa…a的值,其中a是一個(gè)數(shù)字。例如2+22+222+2222+22222(此時(shí)共有5個(gè)數(shù)相加),幾個(gè)數(shù)相加有鍵盤(pán)控制。
程序分析:關(guān)鍵是計(jì)算出每一項(xiàng)
# -*- coding: UTF-8 -*- Tn = 0 Sn = [] #用來(lái)存儲(chǔ)數(shù)字個(gè)數(shù) n = int(raw_input('輸入你想要相加的數(shù)字個(gè)數(shù) n = :')) #控制你要相加的次數(shù) a = int(raw_input('輸入數(shù)字 a = :')) #真正要加的數(shù)字 for count in range(n): Tn = Tn + a a = a * 10 Sn.append(Tn)#每加一個(gè)數(shù)就放在Sn列表中 print Tn #lambda這個(gè)函數(shù)比較強(qiáng)大,具體用法可以看下資料 Sn = reduce(lambda x,y : x + y,Sn) print Sn
輸入你想要相加的數(shù)字個(gè)數(shù) n = :5
輸入數(shù)字 a = :6
6
66
666
6666
66666
74070
用到的函數(shù):
1.python中的reduce內(nèi)建函數(shù)是一個(gè)二元操作函數(shù),他用來(lái)將一個(gè)數(shù)據(jù)集合(鏈表,元組等)中的所有數(shù)據(jù)進(jìn)行下列操作:用傳給reduce中的函數(shù) func()(必須是一個(gè)二元操作函數(shù))先對(duì)集合中的第1,2個(gè)數(shù)據(jù)進(jìn)行操作,得到的結(jié)果再與第三個(gè)數(shù)據(jù)用func()函數(shù)運(yùn)算,最后得到一個(gè)結(jié)果。
具體可參考http://www.dbjr.com.cn/article/128310.htm
2.lambda函數(shù),看連接http://www.dbjr.com.cn/article/128311.htm
23.題目:一個(gè)數(shù)如果恰好等于它的因子之和,這個(gè)數(shù)就稱(chēng)為”完數(shù)”。例如6=1+2+3.編程找出1000以?xún)?nèi)的所有完數(shù)。
程序分析:請(qǐng)參照程序Python 練習(xí)實(shí)例14。只要在后面加上判斷條件就可以了,注意,要在輸出因子的時(shí)候加上1,注意看題,1是任何數(shù)的因子,所以不能漏掉
# -*- coding: UTF-8 -*- import random import time while True: x = random.randint(1,1000) #因?yàn)楹竺媲筚|(zhì)數(shù)要修改x的值,所以先把x保存起來(lái)備用 s = x factors = [1] #1是任何數(shù)的因子 while x > 1: #上限取值可以是x,即因子也可以是x本身,這個(gè)大家都懂得 for v in range(2,x + 1): if x % v == 0: factors.append(v) #找到了當(dāng)前的最小因子,重置繼續(xù)找下一符合條件的最小因子 x /= v #由于break是跳出當(dāng)前的循環(huán),所以這里的break是跳出for循環(huán) break print "所有因子是 %s,所以"%(factors), if sum(factors) == s: #這里就是判斷函數(shù)了 print "%d 是完數(shù)"%(s) else: print "%d 不是完數(shù)"%(s) time.sleep(1) #為防止程序卡頓,我睡一秒輸出一個(gè)
輸出:
所有因子是 [1, 2, 2, 2, 31],所以: 248 不是完數(shù)
所有因子是 [1, 2, 2, 2, 73],所以: 584 不是完數(shù)
所有因子是 [1, 823],所以: 823 不是完數(shù)
所有因子是 [1, 281],所以: 281 不是完數(shù)
所有因子是 [1, 467],所以: 467 不是完數(shù)
所有因子是 [1, 2, 359],所以: 718 不是完數(shù)
所有因子是 [1, 2, 7, 47],所以: 658 不是完數(shù)
所有因子是 [1, 751],所以: 751 不是完數(shù)
所有因子是 [1, 3, 71],所以: 213 不是完數(shù)
24.題目:兩個(gè)乒乓球隊(duì)進(jìn)行比賽,各出三人。甲隊(duì)為a,b,c三人,乙隊(duì)為x,y,z三人。已抽簽決定比賽名單。有人向隊(duì)員打聽(tīng)比賽的名單。a說(shuō)他不和x比,c說(shuō)他不和x,z比,請(qǐng)編程序找出三隊(duì)賽手的名單。
程序分析:用數(shù)學(xué)的角度很好理解是吧,但是這里要把字母轉(zhuǎn)化成ASCII碼來(lái)做哦!
# -*- coding: UTF-8 -*- for i in range(ord('x'),ord('z') + 1): for j in range(ord('x'),ord('z') + 1): if i != j: for k in range(ord('x'),ord('z') + 1): if (i != k) and (j != k): if (i != ord('x')) and (k != ord('x')) and (k != ord('z')): print 'order is a -- %s\t b -- %s\tc--%s' % (chr(i),chr(j),chr(k))
25.題目:有一分?jǐn)?shù)序列:2/1,3/2,5/3,8/5,13/8,21/13…求出這個(gè)數(shù)列的前20項(xiàng)之和。
程序分析:請(qǐng)抓住分子與分母的變化規(guī)律??梢钥闯觯帜甘庆巢瞧鯏?shù)列哦~
方法一:第一個(gè)分?jǐn)?shù)的分子分母之和是第二個(gè)數(shù)的分子。
# -*- coding: UTF-8 -*- a = 2.0 #第一個(gè)數(shù)的分母 b = 1.0 #第一個(gè)數(shù)的分子 s = 0 #前20項(xiàng)的和 for n in range(1,21): s += a / b t = a #先把分子保存到t a = a + b #分子是前一個(gè)分?jǐn)?shù)的分子分母之和 b = t #分子分母交換 print s
方法二:
# -*- coding: UTF-8 -*- a = 2.0 b = 1.0 s = 0.0 for n in range(1,21): s += a / b b,a = a , a + b print s
方法三:
# -*- coding: UTF-8 -*- a = 2.0 b = 1.0 l = [] for n in range(1,21): b,a = a,a + b l.append(a / b) print reduce(lambda x,y: x + y,l)
26.題目:求1+2!+3!+…+20!的和。
程序分析:此程序只是把累加變成了累乘。想一想階乘怎么算的?n!=n×(n-1)×(n-2)×(n-3)×…×1,所以只需要一個(gè)遍歷,把n以?xún)?nèi)的數(shù)字相乘后,再加起來(lái)即可。
方法一:
# -*- coding: UTF-8 -*- n = 0 s = 0 t = 1 for n in range(1,21): t *= n #這里t就是20以?xún)?nèi)每個(gè)數(shù)的階乘 s += t #把每次得到的階乘值加到s print '1! + 2! + 3! + ... + 20! = %d' % s
方法三:這里用定義函數(shù)的方法,使用sum函數(shù)。
# -*- coding: UTF-8 -*- s = 0 l = range(1,21) def op(x): r = 1 for i in range(1,x + 1): r *= i return r s = sum(map(op,l)) print '1! + 2! + 3! + ... + 20! = %d' % s
輸出:1! + 2! + 3! + ... + 20! = 2561327494111820313
這里補(bǔ)充一下map()函數(shù)的用法:
很簡(jiǎn)單,第一個(gè)參數(shù)接收一個(gè)函數(shù)名,第二個(gè)參數(shù)接收一個(gè)可迭代對(duì)象
# -*- coding: UTF-8 -*- ls = [1,2,3] rs = map(str, ls) #打印結(jié)果 ['1', '2', '3'] lt = [1, 2, 3, 4, 5, 6] def add(num): return num + 1 rs = map(add, lt) print rs #打印結(jié)果[2,3,4,5,6,7]
27.題目:利用遞歸方法求5!。
程序分析:遞歸公式:fn=fn_1*4!遞歸的方法就是自己調(diào)用自己。
# -*- coding: UTF-8 -*- def jiecheng(n): if n <= 1: return 1 else: return n * jiecheng(n-1) print jiecheng(5) 輸出:120
28.題目:將所輸入的5個(gè)字符,以相反順序打印出來(lái)。
方法一:利用遞歸函數(shù)調(diào)用方式
# -*- coding: UTF-8 -*- def output(s,l): if l==0: return print (s[l-1]) output(s,l-1) s = raw_input('Input a string:') l = len(s) output(s,l)
輸出:Input a string:1234
4
3
2
1
方法二:用reverse函數(shù)
# -*- coding: UTF-8 -*- a = [1,2,3,4,5] a.reverse() print a 或者: # -*- coding: UTF-8 -*- s = list(raw_input('Input a string:')) s.reverse() print s
28.題目:有5個(gè)人坐在一起,問(wèn)第五個(gè)人多少歲?他說(shuō)比第4個(gè)人大2歲。問(wèn)第4個(gè)人歲數(shù),他說(shuō)比第3個(gè)人大2歲。問(wèn)第三個(gè)人,又說(shuō)比第2人大兩歲。問(wèn)第2個(gè)人,說(shuō)比第一個(gè)人大兩歲。最后問(wèn)第一個(gè)人,他說(shuō)是10歲。請(qǐng)問(wèn)第五個(gè)人多大?
程序分析:利用遞歸的方法,遞歸分為回推和遞推兩個(gè)階段。要想知道第五個(gè)人歲數(shù),需知道第四人的歲數(shù),依次類(lèi)推,推到第一人(10歲),再往回推。
方法一:這個(gè)很簡(jiǎn)單吧,就是每次循環(huán)都加2,循環(huán)4次就好了??!
# -*- coding: UTF-8 -*- x = 10 for i in range(1,5): x = x + 2 print x
方法二:定義函數(shù)的方法
# -*- coding: UTF-8 -*- def age(n): if n == 1: x = 10 else: x = age(n - 1) + 2 return x print age(5)
29.題目:一個(gè)5位數(shù),判斷它是不是回文數(shù)。即12321是回文數(shù),個(gè)位與萬(wàn)位相同,十位與千位相同。
程序分析:將這個(gè)五位數(shù)從中間分開(kāi),根據(jù)對(duì)稱(chēng)性去切,然后比較是否相等。
# -*- coding: UTF-8 -*- a = int(raw_input("請(qǐng)輸入一個(gè)數(shù)字:")) x = str(a) flag = True for i in range(len(x)/2): if x[i] != x[-i - 1]: #如果不相等,直接跳出循環(huán),直接判斷不是回文數(shù) flag = False break if flag: print "%d 是一個(gè)回文數(shù)!" % a else: print "%d 不是一個(gè)回文數(shù)!" % a
輸出:
請(qǐng)輸入一個(gè)數(shù)字:
15651
15651 是一個(gè)回文數(shù)!
30.題目:請(qǐng)輸入星期幾的第一個(gè)字母來(lái)判斷一下是星期幾,如果第一個(gè)字母一樣,則繼續(xù)判斷第二個(gè)字母。
程序分析:用情況語(yǔ)句比較好,如果第一個(gè)字母一樣,則判斷用情況語(yǔ)句或if語(yǔ)句判斷第二個(gè)字母。。哇,這個(gè)題應(yīng)該好簡(jiǎn)單啊~~先看一下星期的單詞都有哪些“Monday Tuesday Wednesday Thursday Friday Saturday Sunday”,所有只有“T”和“S”要判斷第二個(gè)字母。
# -*- coding: UTF-8 -*- letter = raw_input("please input:") #while letter != 'Y': if letter == 'S': print ('please input second letter:') letter = raw_input("please input:") if letter == 'a': print ('Saturday') elif letter == 'u': print ('Sunday') else: print ('data error') elif letter == 'F': print ('Friday') elif letter == 'M': print ('Monday') elif letter == 'T': print ('please input second letter') letter = raw_input("please input:") if letter == 'u': print ('Tuesday') elif letter == 'h': print ('Thursday') else: print ('data error') elif letter == 'W': print ('Wednesday') else: print ('data error')
這篇文章就介紹到這了,后面腳本之家小編將繼續(xù)為大家分享更多的關(guān)于python的一些實(shí)例資料。
相關(guān)文章
Python Matplotlib繪制箱線圖的全過(guò)程
又稱(chēng)箱形圖(boxplot)或盒式圖,數(shù)據(jù)大小、占比、趨勢(shì)等等的呈現(xiàn)其包含一些統(tǒng)計(jì)學(xué)的均值、分位數(shù)、極值等等統(tǒng)計(jì)量,因此該圖信息量較大,下面這篇文章主要給大家介紹了關(guān)于Python Matplotlib繪制箱線圖的相關(guān)資料,需要的朋友可以參考下2021-09-09TensorFlow中權(quán)重的隨機(jī)初始化的方法
本篇文章主要介紹了TensorFlow中權(quán)重的隨機(jī)初始化的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-02-02django filters實(shí)現(xiàn)數(shù)據(jù)過(guò)濾的示例代碼
這篇文章主要介紹了django filters實(shí)現(xiàn)數(shù)據(jù)過(guò)濾的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-05-05python高級(jí)之元類(lèi)的用法總結(jié)
元類(lèi)是Python中最高級(jí)別的編程概念之一,用于創(chuàng)建類(lèi)的類(lèi),雖然元類(lèi)在日常Python編程中并不常見(jiàn),但它們提供了無(wú)限的可能性來(lái)改變類(lèi)的行為,從而使元編程成為可能,這篇文章主要給大家介紹了關(guān)于python高級(jí)之元類(lèi)的相關(guān)資料,需要的朋友可以參考下2024-08-08Python繪制的愛(ài)心樹(shù)與表白代碼(完整代碼)
這篇文章主要介紹了Python繪制的愛(ài)心樹(shù)與表白代碼,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-04-04菜鳥(niǎo)使用python實(shí)現(xiàn)正則檢測(cè)密碼合法性
本文給大家分享了2則使用Python實(shí)現(xiàn)正則表達(dá)式檢測(cè)密碼合法性的代碼,由于是新手,所以方法比較笨,不過(guò)還是分享給小伙伴,希望對(duì)大家能夠有所幫助。2016-01-01keras 獲取某層輸出 獲取復(fù)用層的多次輸出實(shí)例
這篇文章主要介紹了keras 獲取某層輸出 獲取復(fù)用層的多次輸出實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05Python基于正則表達(dá)式實(shí)現(xiàn)計(jì)算器功能
這篇文章主要介紹了Python基于正則表達(dá)式實(shí)現(xiàn)計(jì)算器功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07