python簡單一實例訓練(21~30)__python

來源:互聯網
上載者:User

21.題目:將一個正整數分解質因數。例如:輸入90,列印出90=2*3*3*5。

程式分析:對n進行分解質因數,應先找到一個最小的質數k,然後按下述步驟完成:

(1)如果這個質數恰等於n,則說明分解質因數的過程已經結束,列印出即可。

(2)如果n!=k,但n能被k整除,則應列印出k的值,並用n除以k的商,作為新的正整數你n,重複執行第一步。

(3)如果n不能被k整除,則用k+1作為k的值,重複執行第一步。

注意:要知道 format 這個函數,其實就是格式化,與 print 差不多,具體可參考http://www.jb51.net/article/63672.htm

方法一:只用迴圈

# -*- coding: UTF-8 -*-while True:    n = input("請輸入一個數:")    #這裡有逗號是為了保證它輸出後不自動換行,下同    print '{} = '.format(n),     #判斷你輸入的是不是正確格式    if not isinstance(n, int) or n <= 0 :        print '請輸入一個正確的數字 !'     #如果你是輸入的是 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 一定是素數                    print '{} *'.format(i),                break    print     #換行咯

方法二:定義函數

# -*- coding: UTF-8 -*-def reduceNum(n):    print '{} = '.format(n),    if not isinstance(n, int) or n <= 0 :        print '請輸入一個正確的數字 !'        exit(0)    elif n in [1] :        print '{}'.format(n)    while n not in [1] : # 迴圈保證遞迴        for i in range(2, n + 1) :            if n % i == 0:                n /= i # n 等於 n/i                if n == 1:                     print i                 else : # i 一定是素數                    print '{} *'.format(i),                breakreduceNum(100)reduceNum(9)
    輸出:    100 =  2 * 2 * 5 * 5    9 =  3 * 3

方法三:用列表 append 函數,這裡只是用列表的形式輸出了所有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]

說明:其實兩種方法大同小異,沒什麼區別。

22.題目:求s=a+aa+aaa+aaaa+aa…a的值,其中a是一個數字。例如2+22+222+2222+22222(此時共有5個數相加),幾個數相加有鍵盤控制。

程式分析:關鍵是計算出每一項

# -*- coding: UTF-8 -*-Tn = 0Sn = [] #用來儲存數字個數n = int(raw_input('輸入你想要相加的數字個數 n = :'))  #控制你要相加的次數a = int(raw_input('輸入數字 a = :'))    #真正要加的數字for count in range(n):    Tn = Tn + a     a = a * 10    Sn.append(Tn)#每加一個數就放在Sn列表中    print Tn    #lambda這個函數比較強大,具體用法可以看下資料Sn = reduce(lambda x,y : x + y,Sn)print Sn
輸入你想要相加的數字個數 n = :5輸入數字 a = :666666666666666674070

用到的函數:

1.python中的reduce內建函數是一個二元操作函數,他用來將一個資料集合(鏈表,元組等)中的所有資料進行下列操作:用傳給reduce中的函數 func()(必須是一個二元操作函數)先對集合中的第1,2個資料進行操作,得到的結果再與第三個資料用func()函數運算,最後得到一個結果。

具體可參考http://blog.csdn.net/SeeTheWorld518/article/details/46975857

2.lambda函數,看串連http://blog.csdn.net/mtbaby/article/details/53099072

23.題目:一個數如果恰好等於它的因子之和,這個數就稱為”完數”。例如6=1+2+3.編程找出1000以內的所有完數。

程式分析:請參照程式Python 練習執行個體14。只要在後面加上判斷條件就可以了,注意,要在輸出因子的時候加上1,注意看題,1是任何數的因子,所以不能漏掉

# -*- coding: UTF-8 -*-import randomimport timewhile True:    x = random.randint(1,1000)    #因為後面求質數要修改x的值,所以先把x儲存起來備用    s = x     factors = [1] #1是任何數的因子    while x > 1:        #上限取值可以是x,即因子也可以是x本身,這個大家都懂得        for v in range(2,x + 1):            if x % v == 0:                factors.append(v)                 #找到了當前的最小因子,重設繼續找下一合格最小因子                x /= v                #由於break是跳出當前的迴圈,所以這裡的break是跳出for迴圈                break    print "所有因子是 %s,所以"%(factors),    if sum(factors) == s: #這裡就是判斷函數了        print "%d 是完數"%(s)    else:        print "%d 不是完數"%(s)time.sleep(1)   #為防止程式卡頓,我睡一秒輸出一個
輸出:    所有因子是 [1, 2, 2, 2, 31],所以: 248 不是完數    所有因子是 [1, 2, 2, 2, 73],所以: 584 不是完數    所有因子是 [1, 823],所以: 823 不是完數    所有因子是 [1, 281],所以: 281 不是完數    所有因子是 [1, 467],所以: 467 不是完數    所有因子是 [1, 2, 359],所以: 718 不是完數    所有因子是 [1, 2, 7, 47],所以: 658 不是完數    所有因子是 [1, 751],所以: 751 不是完數    所有因子是 [1, 3, 71],所以: 213 不是完數
...

24.題目:兩個乒乓球隊進行比賽,各出三人。甲隊為a,b,c三人,乙隊為x,y,z三人。已抽籤決定比賽名單。有人向隊員打聽比賽的名單。a說他不和x比,c說他不和x,z比,請編程式找出三隊賽手的名單。

程式分析:用數學的角度很好理解是吧,但是這裡要把字母轉化成ASCII碼來做哦。

# -*- 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.題目:有一分數序列:2/1,3/2,5/3,8/5,13/8,21/13…求出這個數列的前20項之和。

程式分析:請抓住分子與分母的變化規律。可以看出,分母是斐波那契數列哦~

方法一:第一個分數的分子分母之和是第二個數的分子。

# -*- coding: UTF-8 -*-a = 2.0       #第一個數的分母b = 1.0       #第一個數的分子s = 0         #前20項的和for n in range(1,21):    s += a / b    t = a      #先把分子儲存到t    a = a + b  #分子是前一個分數的分子分母之和    b = t      #分子分母交換print s

方法二:

# -*- coding: UTF-8 -*-a = 2.0b = 1.0s = 0.0for n in range(1,21):    s += a / b    b,a = a , a + bprint s

方法三:

 # -*- coding: UTF-8 -*-a = 2.0b = 1.0l = []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,所以只需要一個遍曆,把n以內的數字相乘後,再加起來即可。

方法一:

 # -*- coding: UTF-8 -*-n = 0s = 0t = 1for n in range(1,21):    t *= n   #這裡t就是20以內每個數的階乘    s += t   #把每次得到的階乘值加到sprint '1! + 2! + 3! + ... + 20! = %d' % s

方法三:這裡用定義函數的方法,使用sum函數。

# -*- coding: UTF-8 -*-s = 0l = range(1,21)def op(x):    r = 1    for i in range(1,x + 1):        r *= i    return rs = sum(map(op,l))  print '1! + 2! + 3! + ... + 20! = %d' % s
輸出:1! + 2! + 3! + ... + 20! = 2561327494111820313

這裡補充一下map()函數的用法:

很簡單,第一個參數接收一個函數名,第二個參數接收一個可迭代對象

# -*- coding: UTF-8 -*-ls = [1,2,3]rs = map(str, ls)#列印結果 ['1', '2', '3']lt = [1, 2, 3, 4, 5, 6]def add(num):    return num + 1rs = map(add, lt)print rs #列印結果[2,3,4,5,6,7]

27.題目:利用遞迴方法求5!。

程式分析:遞迴公式:fn=fn_1*4!遞迴的方法就是自己調用自己。

# -*- coding: UTF-8 -*-def jiecheng(n):    if n <= 1:        return 1    else:        return n * jiecheng(n-1)print jiecheng(5)輸出:120

28.題目:將所輸入的5個字元,以相反順序列印出來。

方法一:利用遞迴函式調用方式

 # -*- 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函數

# -*- 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個人坐在一起,問第五個人多少歲。他說比第4個人大2歲。問第4個人歲數,他說比第3個人大2歲。問第三個人,又說比第2人大兩歲。問第2個人,說比第一個人大兩歲。最後問第一個人,他說是10歲。請問第五個人多大。

程式分析:利用遞迴的方法,遞迴分為回推和遞推兩個階段。要想知道第五個人歲數,需知道第四人的歲數,依次類推,推到第一人(10歲),再往回推。

方法一:這個很簡單吧,就是每次迴圈都加2,迴圈4次就好了啊。

# -*- coding: UTF-8 -*-x = 10for i in range(1,5):    x = x + 2print x

方法二:定義函數的方法

# -*- coding: UTF-8 -*-def age(n):    if n == 1:         x = 10    else:         x = age(n - 1) + 2    return xprint age(5)

29.題目:一個5位元,判斷它是不是迴文數。即12321是迴文數,個位與萬位相同,十位與千位相同。

程式分析:將這個五位元從中間分開,根據對稱性去切,然後比較是否相等。

# -*- coding: UTF-8 -*-a = int(raw_input("請輸入一個數字:"))x = str(a)flag = Truefor i in range(len(x)/2):    if x[i] != x[-i - 1]:  #如果不相等,直接跳出迴圈,直接判斷不是迴文數    flag = False    breakif flag:    print "%d 是一個迴文數!" % aelse:    print "%d 不是一個迴文數!" % a
輸出:    請輸入一個數字:    15651    15651 是一個迴文數!

30.題目:請輸入星期幾的第一個字母來判斷一下是星期幾,如果第一個字母一樣,則繼續判斷第二個字母。

程式分析:用情況語句比較好,如果第一個字母一樣,則判斷用情況語句或if語句判斷第二個字母。。哇,這個題應該好簡單啊~~先看一下星期的單詞都有哪些“Monday Tuesday Wednesday Thursday Friday Saturday Sunday”,所有只有“T”和“S”要判斷第二個字母。

    # -*- 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')
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.