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 练习实例
题目:将一个列表的数据复制到另一个列表中。
程序分析:使用列表[:]。
#!/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 time1
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 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)