python简单实例训练(21~30)

来源:互联网 发布:ios wkwebview js弹窗 编辑:程序博客网 时间:2024/05/29 07:26

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')
0 0
原创粉丝点击