Python程序设计05-函数
1
6-1 使用函数求特殊a串数列和 (30 分)
给定两个均不超过9的正整数a和n,要求编写函数fn(a,n) 求a+aa+aaa++⋯+aa⋯aa(n个a)之和,fn须返回的是数列和
函数接口定义:
fn(a,n)
其中 a 和 n 都是用户传入的参数。 a 的值在[1, 9]范围;n 是[1, 9]区间内的个位数。函数须返回级数和
裁判测试程序样例:
/* 请在这里填写答案 */
a,b=input().split()
s=fn(int(a),int(b))
print(s)
输入样例:
在这里给出一组输入。例如:
2 3
输出样例:
在这里给出相应的输出。例如:
246
def fn(a,n):
fin = 0
b = a
for i in range(n):
fin = fin + a
a = a * 10 + b
return fin
2
6-2 使用函数求素数和 (20 分)
使用函数求素数和
prime§, 其中函数prime当用户传入参数p为素数时返回True,否则返回False. PrimeSum(m,n),函数PrimeSum返回区间[m, n]内所有素数的和。题目保证用户传入的参数1<=m<n。
函数接口定义:
在这里描述函数接口:
prime§,返回True表示p是素数,返回False表示p不是素数
PrimeSum(m,n),函数返回素数和
裁判测试程序样例:
/* 请在这里填写答案 */
m,n=input().split()
m=int(m)
n=int(n)
print(PrimeSum(m,n))
输入样例:
在这里给出一组输入。例如:
1 10
输出样例:
在这里给出相应的输出。例如:
17
def PrimeSum(m,n):
fin = 0
def prime(p):
for i in range(2,p):
if p % i == 0:
return False
return True
for i in range(m,n + 1):
if prime(i) == True:
fin = fin + i
if m == 1:
fin = fin - 1
return fin
3
6-3 使用函数统计指定数字的个数 (20 分)
本题要求实现一个统计整数中指定数字的个数的简单函数。
CountDigit(number,digit )
其中number是整数,digit为[1, 9]区间内的整数。函数CountDigit应返回number中digit出现的次数。
函数接口定义:
在这里描述函数接口。例如:
CountDigit(number,digit ),返回digit出现的次数
裁判测试程序样例:
/* 请在这里填写答案 */
number,digit=input().split()
number=int(number)
digit=int(digit)
count=CountDigit(number,digit )
print(“Number of digit 2 in “+str(number)+”:”,count)
输入样例:
在这里给出一组输入。例如:
-21252 2
输出样例:
在这里给出相应的输出。例如:
Number of digit 2 in -21252: 3
def CountDigit(number,gigit):
n = 0
alist = []
if number < 0:
number = abs(number)
while number:
alist.append(int(number % 10))
number = number // 10
for i in range(len(alist)):
if alist[i] == gigit:
n = n + 1
return n
4
6-4 使用函数输出指定范围内Fibonacci数的个数 (20 分)
本题要求实现一个计算Fibonacci数的简单函数,并利用其实现另一个函数,输出两正整数m和n(0<m<n≤100000)之间的所有Fibonacci数的数目。 所谓Fibonacci数列就是满足任一项数字是前两项的和(最开始两项均定义为1)的数列,fib(0)=fib(1)=1。其中函数fib(n)须返回第n项Fibonacci数;函数PrintFN(m,n)用列表返回[m, n]中的所有Fibonacci数。
函数接口定义:
在这里描述函数接口。例如:
fib(n),返回fib(n)的值
PrintFN(m,n),用列表返回[m, n]中的所有Fibonacci数。
裁判测试程序样例:
在这里给出函数被调用进行测试的例子。例如:
/* 请在这里填写答案 */
m,n,i=input().split()
n=int(n)
m=int(m)
i=int(i)
b=fib(i)
print(“fib({0}) = {1}”.format(i,b))
fiblist=PrintFN(m,n)
print(len(fiblist))
输入样例:
在这里给出一组输入。例如:
20 100 6
输出样例:
在这里给出相应的输出。例如:
fib(6) = 13
4
def fib(n):
a = 0
b = 1
c = a + b
for i in range(n-1):
a = b
b = c
c = a + b
return c
def PrintFN(m,n):
alist = []
i = 1
while fib(i) < m:
i = i + 1
j = i
while fib(j) <= n:
j = j + 1
for m in range(i,j):
alist.append(fib(m))
return alist
5
6-5 汉诺塔问题 (15 分)
汉诺塔问题求解:有三根相邻的柱子,假设标号分别为A、B、C,其中A柱子从下到上按金字塔状依次叠放了N个不同大小的圆盘,现要把A柱子上的所有圆盘一次一个地移动到C柱子上,移动的过程中可以借助B柱子做中转,并且每根柱子上的圆盘必须始终保持上小下大的叠放顺序。编写一个函数,输出移动轨迹(提示:用递归函数)
函数接口定义:
函数接口:
hanoi(n,a,b,c),print移动轨迹并统计移动次数
n表示要移动的圆盘个数,a,b,c为三根柱子名称,表示将盘子从a移动到c,b为中转柱。
裁判测试程序样例:
测试样例:
n=int(input())
step=0
hanoi(n,‘A’,‘B’,‘C’)
print(‘共移动次数:’,step)
输入样例1:
输入n(1<=n<=5):
1
输出样例1:
在这里给出相应的输出。例如:
A -> C
共移动次数: 1
输入样例2:
输入n(1<=n<=5):
3
输出样例2:
在这里给出相应的输出。例如:
A -> C
A -> B
C -> B
A -> C
B -> A
B -> C
A -> C
共移动次数: 7
count = 0
def hanoi(n, a, b, c):
global count # 声明全局变量
global step
if n == 1: # 1个环的情况,也是递归的出口
print(a, '->', c) # 第一个环的移动情况
count = count + 1 # 次数+1
step = count
else: # n > 1时,用抽象出的3步来移动
hanoi(n - 1, a, c, b) # 将(n-1个环)从a移动到b上
print(a, '->', c) # 将底盘从a移动到c上
count = count + 1 # 第n个环的移动情况
hanoi(n - 1, b, a, c) # 将b上的(n-1个环)移动到c
step = count
n=int(input())
step=0
hanoi(n,'A','B','C')
print('共移动次数:',step)
6
6-6 兔子繁殖 (15 分)
兔子繁殖问题。假设有一对新生的兔子,从第三个月开始他们每个月月初都生一对兔子,新生的兔子从第三个月月初开始又每个月又生一对兔子。按此规律,并假定兔子没有死亡,n(n<=20)个月月末共有多少对兔子?
函数接口定义:
函数接口:
rabit(n),n为第几个月
裁判测试程序样例:
n=int(input())
print(rabit(n))
输入样例1:
在这里给出一组输入。例如:
3
输出样例1:
在这里给出相应的输出。例如:
2
输入样例2:
在这里给出一组输入。例如:
5
输出样例2:
在这里给出相应的输出。例如:
5
def rabit(n):
a = 0
b = 1
c = 0
#这题就是费波纳茨数列
for i in range(n):
a = b
b = c
c = a + b
return c
7
6-7 成绩绩点计算 (10 分)
假设某大学的成绩绩点计算规则为:90分(含)以上计4.5分,80分(含)-90分(不含)计3分,70分(含)-80分(不含)计1.5分,60分(含)-70分(不含)计1分,60分以下不计分。输入某位同学的各门课成绩,请编写一个函数,打印该同学的平均绩点(保留2位小数)。
函数接口定义:
函数接口描述:
GPA(参数…)
裁判测试程序样例:
lst=list(map(eval,input().split()))
GPA(*lst)
输入样例1:
在这里给出一组输入。例如:
90 95 87
输出样例1:
在这里给出相应的输出。例如:
4.00
输入样例2:
在这里给出一组输入。例如:
60 73 88 59
输出样例2:
在这里给出相应的输出。例如:
1.38
def GPA(*lst):
fin = 0
av = 0
for i in range(len(lst)):
if lst[i] >= 90:
fin = fin + 4.5
elif lst[i] >=80 and lst[i] < 90:
fin = fin + 3
elif lst[i] >= 70 and lst[i] < 80:
fin = fin + 1.5
elif lst[i] >= 60 and lst[i] < 70:
fin = fin + 1
else:
fin = fin + 0
av = fin / len(lst)
print("{:.2f}".format(av))
8
6-8 求嵌套列表的平均值 (30 分)
Avg是一个求平均值的函数。它的参数是嵌套列表,求每个元素的平均值。每个元素是列表,至少有1个值。
函数接口定义:
在这里描述函数接口。例如:
Avg(lst)
lst是一个二维嵌套列表,该函数返回值是每个元素的平均值组成的列表。
裁判测试程序样例:
/* 请在这里填写答案 */
lst=eval(input())
result=Avg(lst)
for value in result:
print("{:.1f}".format(value),end=" ")
输入样例:
在这里给出一组输入。例如:
[[95,92,80],[66,75,40],[89,72,100,91]]
输出样例:
在这里给出相应的输出。例如:
89.0 60.3 88.0
def Avg(lst):
blst = []
for i in range(len(lst)):
fin = 0
avg = 0
for j in range(len(lst[i])):
fin = fin + lst[i][j]
avg = fin / len(lst[i])
blst.append(avg)
return blst
9
6-9 求多项式的值 (30 分)
一元多项式可以用列表表示。如p(x)=1+3x+9x
4
,可以表示成列表[1,3,0,0,9]。输入列表表示的多项式和x的值,求多项式的值。
函数接口定义:
在这里描述函数接口。例如:
value(lst,x)
lst表示多项式,x代表具体的值。
裁判测试程序样例:
/* 请在这里填写答案 */
lst=eval(input())
y=float(input())
print("{:.1f}".format(polyvalue(lst,y)))
输入样例:
在这里给出一组输入。例如:
[1,3,0,0,9]
1
输出样例:
在这里给出相应的输出。例如:
13.0
def polyvalue(lst,y):
fin = lst[0]
x = y
for i in range(1,len(lst)):
j = i
fin = fin + lst[i] * y
y = y * x
return fin
10
6-10 jmu-python-函数-找钱 (10 分)
买单时,营业员要给用户找钱。营业员手里有10元、5元、1元(假设1元为最小单位)几种面额的钞票,其希望以
尽可能少(张数)的钞票将钱换给用户。比如,需要找给用户17元,那么其需要给用户1张10元,1张5元,2张1元。
而不是给用户17张1元或者3张5元与2张1元。
函数接口定义:
giveChange(money) #money为要找的钱。经过计算,应按格式"要找的钱 = x10 + y5 + z1"输出。
裁判测试程序样例:
/ 请在这里填写答案 /
n = int(input())
for i in range(n):
giveChange(int(input()))
输入样例:
5
109
17
10
3
0
输出样例:
109 = 1010 + 15 + 41
17 = 110 + 15 + 21
10 = 110 + 05 + 01
3 = 010 + 05 + 31
0 = 010 + 05 + 01
def giveChange(money):
shi = int(money / 10)
if money % 10 == 0:
print("{} = {}*10 + 0*5 + 0*1".format(money, shi))
else:
sh = money - (shi * 10)
wu = int(sh / 5)
if sh % 5 == 0:
print("{} = {}*10 + {}*5 + 0*1".format(money, shi, wu))
else:
eng = int((money - (shi * 10) - (wu * 5)))
yi = int(eng / 1)
print("{} = {}*10 + {}*5 + {}*1".format(money, shi, wu, yi))
11
6-11 人民币美元双向兑换 (10 分)
本题要求实现一个人民币与美元的双向兑换函数change(money),可实现1美元=6.709人民币的双向兑换。输出兑换的结果保留2位小数。
函数接口定义:
在这里描述函数接口。例如:
change( money )
其中 money都是用户传入的参数,表示待兑换的钱数。
裁判测试程序样例:
/* 请在这里填写答案 */
x = input()
change(x)
输入样例1:
在这里给出一组输入。例如:
$1
输出样例1:
在这里给出相应的输出。例如:
1美元 = 6.71人民币
输入样例2:
在这里给出一组输入。例如:
¥1
输出样例2:
在这里给出相应的输出。例如:
1人民币 = 0.15美元
def change(money):
money = money.strip()
if '$' in money:
mei = eval(money[1:])
print("{}美元 = {:.2f}人民币".format(mei,mei * 6.709))
else:
ren = eval(money[1:])
print("{}人民币 = {:.2f}美元".format(ren,ren / 6.709))
12
6-12 平均成绩和等级 (15 分)
输入五个考试分数,输出对应的等级和平均分,分级规则见下表。在程序中编写2个函数: cal_average(g1,g2,g3,g4,g5)和cal_grade(g)。
函数接口定义:
cal_average(g1,g2,g3,g4,g5)。参数g1,g2,g3,g4,g5接受五门课的成绩,并返回分数的平均值。
cal_grade(g)。参数g接受一个考试分数作为参数,并返回成绩等级。
裁判测试程序样例:
/* 请在这里填写答案 */
n0,n1,n2,n3,n4=map(eval,input().split())
print(cal_average(n0,n1,n2,n3,n4))
for i in range(5):
n=eval(‘n’+str(i))
print(cal_grade(n))
输入样例:
在这里给出一组输入。例如:
66 77 88 99 55
输出样例:
在这里给出相应的输出。例如:
77.0
D
C
B
A
F
def cal_grade(g):
if g >= 90:
return 'A'
elif g >= 80 and g <= 89:
return 'B'
elif g >= 70 and g <= 79:
return 'C'
elif g >= 60 and g <= 69:
return 'D'
else:
return 'F'
def cal_average(g0,g1,g2,g3,g4):
fin = int(g0) + int(g1) + int(g2) + int(g3) + int(g4)
return fin / 5
13
7-1 最短跑道长度(高教社,《Python编程基础及应用》习题3-12 (3 分)
假设某飞机的加速度是a,起飞的速度是v,下述公式可以计算出该飞机起飞所需的最短跑道长度: L = v2/(2a)。编写一个程序,提示用户输入起飞速度v(m/s)和加速度a(m/s2),计算飞机起飞的最短跑道长度,输出时保留2位小数。计算过程宜封装成一个函数,该函数接受参数v和a,返回计算所得的L。
输入样例:
在这里给出一组输入。例如:
100
5
输出样例:
在这里给出相应的输出。例如:
最短跑道长度为:1000.00
提示:本题中的冒号均为英文冒号。
def prime(v,a):
l = (v ** 2) / (2 * a)
return l
v = int(input())
a = int(input())
print("最短跑道长度为:{:.2f}".format(prime(v,a)))
14
7-2 重复元素查找 (100 分)
每一个列表中只要有一个元素出现两次,那么该列表即被判定为包含重复元素。
编写程序:对n行字符串进行处理,一行字符串构成一个列表。程序判定每一个列表中是否包含重复元素。最后统计包含重复元素的行数与不包含重复元素的行数。
输入格式:
输入n,代表接下来要输入n行字符串。
然后输入n行字符串,字符串之间的元素以空格相分隔。
输出格式:
True=包含重复元素的行数
False=不包含重复元素的行数
输入样例:
5
1 a 3 c 5
a 3 c 5 d
b 2 3 b 1
x 2 w 2 w
a 1 1 1 1
输出样例:
True= 3
False= 2
def prime(alist):
alist = list(alist)
for line in alist:
if alist.count(line) > 1:
return True
return False
data = int(input())
blist = []
for i in range(data):
alist = input().strip("\n").split()
blist.append(prime(alist))
print("True= {}".format(blist.count(True)))
print("False= {}".format(blist.count(False)))
15
7-3 大型田字格 (10 分)
设计程序,输入n,输出n×n的田字格。
输入格式:
输入一个0~10之间的整数,n∈[0,10]
输出格式:
使用print函数输出“+”、“-”、“|”以及空格组成的田字格图形(每个方格由四个‘+’号,水平),如输入为0,什么也不输出。
输入样例:
在这里给出一组输入。例如:
1
输出样例:
在这里给出相应的输出。例如:
输入样例:
在这里给出一组输入。例如:
4
输出样例:
在这里给出相应的输出。例如:
data = int(input())
if data == 0:
pass
else:
for i in range(data):
print("+ - - - - "*data+"+")
print("| "*data+"|")
print("| "*data+"|")
print("| " * data + "|")
print("| " * data + "|")
print("+ - - - - "*data+"+")