慕课python期末试题+python基础实例

1.题目内容:

某些英语单词的字母经过重新排列后,能获得另外一个单词,如可以将“cinema”转换成另一个单词“iceman”。编写程序,将词表中由相同字母组成的单词聚成一类,并按照单词个数由多到少的顺序输出各类中的全部单词(每类占一行,单词按字典序由小到大排列,之间用空格分隔),若每类中单词个数相同,则按每类中第一个单词的字典序由大到小输出各个类别。

输入格式:

按字典序由小到大输入若干个单词,每个单词占一行。

输出格式:

并按照单词个数由多到少的顺序输出各类中的全部单词(每类占一行,单词按字典序由小到大排列,之间用空格分隔),若每类中单词个数相同,则按每类中第一个单词的字典序由大到小输出各个类别。

输入样例:

cinema

iceman

maps

spam

输出样例:

maps spam

cinema iceman

时间限制:500ms内存限制:32000kb

第一题暂时没什么思路- -

2.题目内容:

两位整数相乘形成的最大回文数是 9009 = 99 × 91。编写程序,求得任意输入的 n 位整数相乘形成的最大回文数。

输入格式:

正整数 n

输出格式:

n 位整数相乘形成的最大回文数

输入样例:

2

输出样例:

9009

这道题第一反应就是倒序遍历,然后自己就死磕在了超出时间这个问题上。
当4位时,python速度已经很慢了。提交之后在讨论区看到别人的优化代码,速度明显提高,贴上来研究研究。
# -*- coding: cp936 -*-
def panduan(mun_1):
        #判断是否是回文数
        a = str(mun_1)
        b = list(a)
        b.reverse()
        c = ''.join(b)
        if a == c:
            return True
        else:
            return False
def mun(n):
        #N位整数最大值
        a = 10**n -1
        return a

n = int(raw_input())
a = mun(n)
b = mun(n)
mun_max = 0
mun = 0
max_b = 0
while True:
        b -= 1
        mun = a * b
        if panduan(mun):
            if mun >= mun_max:
                mun_max = mun
                max_b = b
        if mun <= mun_max or mun <= 10**(n * 2 - 1):
            a -= 1
            b = a
            if a == max_b:
                break
print mun_max

Python 练习实例

Python 练习实例
题目:将一个列表的数据复制到另一个列表中。

程序分析:使用列表[:]。

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

"""将一个列表的数据复制到另一个列表中。"""

"""
使用[:]

"""

a = [1,2,3]
b = a[:]
print b       # 将a的数据赋值给b 当a的数值发生改变时b不变
[1, 2, 3]
a = [1,2,3]
b = a
print b       # 将a的地址赋值给b 当a的数值发生改变时b随之改变
[1, 2, 3]
a = [1,2,3]
b = a[:]
print b
a[0] = 0
print a        # 将a的数据赋值给b 当a的数值发生改变时b不变
print b
[1, 2, 3]
[0, 2, 3]
[1, 2, 3]
a = [1,2,3]
b = a
print b
a[0] = 0
print a         # 将a的地址赋值给b 当a的数值发生改变时b随之改变
print b

题目:输出 9*9 乘法口诀表。

程序分析:分行与列考虑,共9行9列,i控制行,j控制列。

# -*- coding: UTF-8 -*-

for i in range(1, 10):
    print       #外层循环改变换行
    for j in range(1, i+1):
        print "%d*%d=%d" % (i, j, i*j)

②
for i in range(1,10):
    l=[]
    for j in range(1,i+1):
        l.append(str(j)+"*"+str(i)+"="+str(i*j))
    print(" ".join(l))                      

题目:古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?

程序分析:兔子的规律为数列1,1,2,3,5,8,13,21….

程序源代码:

①递归
!/usr/bin/python
# -*- coding: UTF-8 -*-

# time 为第几个月,n 为 3
def rabbit(time,n):
    if time<1:
        return 0
    elif time==1:
        num=1
    elif time<n:
        num=1
    else:
        num=rabbit(time-1,n)+rabbit(time-(n-1),n)
    return num
print rabbit(25,3)
②
# -*- coding: utf-8 -*-

Rabbits={'rabbits':0}    # 新生兔子
home=[{'rabbits':1}]     # 所有兔子对都在这个列表中,初始按过完一月计算
month=int(raw_input('请输入月份:'))
time=1                   # time 表示已经过完的月数,到了该月月末。

while time <month:
    for j in home:
        if j['rabbits']>=2:
            home.append(Rabbits.copy())
        else:
            j['rabbits']+=1
    time+=1

print '兔子数量为 %u。'% len(home)
③
def rabbit(n):
    count = [1,0,0]  #将兔子成长期分为三个月
    for i in range(1,n): #每个月更新一次不同成长期的兔子对数
        count[2] = count[2] + count[1]
        count[1] = count[0]
        count[0] = count[2]
    return count[0]+count[1]+count[2] #返回兔子对数总数

n = int(input("查看第几个月的兔子对数:"))
rabbit_sum = rabbit(n)
print("第%d个月的兔子对数为%d"%(n,rabbit_sum))

题目:将一个正整数分解质因数。例如:输入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的值,重复执行第一步。

程序源代码:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

def reduceNum(n):
    print '{} = '.format(n),#基本语法是通过 {} 和 : 来代替以前的 % 。format 函数可以接受不限个参数,位置可以不按顺序。
    if not isinstance(n, int) or n <= 0 :
        print '请输入一个正确的数字 !'
        exit(0)
    elif n in [1] :
        print '{}'.format(n)
    while n not in [1] : # 循环保证递归
        for index in xrange(2, n + 1) :
            if n % index == 0:
                n /= index # n 等于 n/index
                if n == 1: 
                    print index 
                else : # index 一定是素数
                    print '{} *'.format(index),
                break
reduceNum(90)
reduceNum(100)
②
n=int(raw_input('Please input a number:'))
n1=n
l=[]
while n>1:
    for i in range(2,n+1):
        if n%i==0:
            n=n/i
            l.append(str(i))
            break

print '%d=' %n1 + '*'.join(l)
  • 13
    点赞
  • 73
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值