PTA-MOOC《Python程序设计浙江大学》拼题题目集第六章题目及代码答案

6-1 使用函数求特殊a串数列和 (10分)

给定两个均不超过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):
    count=0
    if 1<=a<=9 and 1<=n<=9:
        for i in range(1,n+1):
            count+=int(str(a)*i)
    return count

6-2 使用函数求素数和 (20分)

使用函数求素数和

prime§, 其中函数prime当用户传入参数p为素数时返回True,否则返回False. PrimeSum(m,n),函数PrimeSum返回区间[m, n]内所有素数的和。题目保证用户传入的参数1<=m

函数接口定义:
在这里描述函数接口:
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 prime(p):
    flag=1
    if p == 1:
        return False
    for i in range(2,p):
        if p%i==0:
            flag=0
            return False
    if flag==1:
        return True
def PrimeSum(m,n):
    sum=0
    for i in range(m,n+1):
        if prime(i):
            sum+=i
    return sum

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,digit):
    number=str(number)
    return number.count(str(digit))

6-4 使用函数输出指定范围内Fibonacci数的个数 (20分)

本题要求实现一个计算Fibonacci数的简单函数,并利用其实现另一个函数,输出两正整数m和n(0

函数接口定义:
在这里描述函数接口。例如:
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):
    if n==0 or n==1:
        return 1
    else:
        return fib(n-2)+fib(n-1)
def PrintFN(m,n):
    data=[]
    i=0
    while fib(i)<=n:
        if fib(i)>=m:
            data.append(fib(i))
        i+=1
    return data   

6-5 使用函数求余弦函数的近似值(20分)

本题要求实现一个函数,用下列公式求cos(x)近似值,精确到最后一项的绝对值小于eps(绝对值小于eps的项不要加):

cos (x) = x^0 / 0! - x^2 / 2! + x^4 / 4! - x^6 / 6! + ?

函数接口定义:funcos(eps,x ),其中用户传入的参数为eps和x;函数funcos应返回用给定公式计算出来,保留小数4位。

函数接口定义:
函数接口:
funcos(eps,x ),返回cos(x)的值。

裁判测试程序样例:
在这里给出函数被调用进行测试的例子。例如:

/* 请在这里填写答案 */

eps=float(input())
x=float(input())
value=funcos(eps,x )
print("cos({0}) = {1:.4f}".format(x,value))

输入样例:
在这里给出一组输入。例如:

0.0001
-3.1

输出样例:
在这里给出相应的输出。例如:

cos(-3.1) = -0.9991

代码

def a(n):
    sum=1
    if n==0:
        return 1
    for i in range(1,n+1):
        sum*=i
    return sum    
def funcos(eps,x):
    data=[]
    i=0
    j=2
    sum1=0
    while abs((x**i)/a(i)) >= eps:
        sum1+=(x**i)/a(i)
        i+=4
    while abs((x**j)/a(j)) >= eps:
        sum1-=(x**j)/a(j)
        j+=4
    return sum1

6-6 缩写词(20分)

缩写词是由一个短语中每个单词的第一个字母组成,均为大写。例如,CPU是短语“central processing unit”的缩写。

函数接口定义:
acronym(phrase);
phrase是短语参数,返回短语的缩写词

裁判测试程序样例:

/* 请在这里填写答案 */

phrase=input()
print(acronym(phrase))

输入样例:

central  processing  unit

输出样例:

CPU

代码

def acronym(phrase):
    data=phrase.split()
    s=""
    for i in range(len(data)):
        s+=data[i][0].upper()
    return s

7-1 输入列表,求列表元素和(eval输入应用) (10分)

在一行中输入列表,输出列表元素的和。

输入格式:
一行中输入列表。

输出格式:
在一行中输出列表元素的和。

输入样例:

[3,8,-5]

输入样例:

6

代码

s=list(map(int,eval(input())))
print(sum(s))

7-2 一帮一 (15分)

“一帮一学习小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。本题就请你编写程序帮助老师自动完成这个分配工作,即在得到全班学生的排名后,在当前尚未分组的学生中,将名次最靠前的学生与名次最靠后的异性学生分为一组。

输入格式:
输入第一行给出正偶数N(≤50),即全班学生的人数。此后N行,按照名次从高到低的顺序给出每个学生的性别(0代表女生,1代表男生)和姓名(不超过8个英文字母的非空字符串),其间以1个空格分隔。这里保证本班男女比例是1:1,并且没有并列名次。

输出格式:
每行输出一组两个学生的姓名,其间以1个空格分隔。名次高的学生在前,名次低的学生在后。小组的输出顺序按照前面学生的名次从高到低排列。

输入样例:

8
0 Amy
1 Tom
1 Bill
0 Cindy
0 Maya
1 John
1 Jack
0 Linda

输出样例:

Amy Jack
Tom Linda
Bill Maya
Cindy John

代码

s=int(input())
data=[]
n=[]
for i in range(s):
    data.append(input().split())
for i in range(s//2):
    for j in range(s-1,s//2-1,-1):
        if data[j][1] not in n:
            if int(data[i][0])+int(data[j][0]) == 1:
                print("%s %s"%(data[i][1],data[j][1]))
                n.append(data[j][1])
                break

7-3 列表或元组的数字元素求和 (20分)

求列表中数字和,列表中嵌套层次不限2层

输入格式:
在一行中输入列表或元组

输出格式:
在一行中输出数字的和

输入样例:
在这里给出一组输入。例如:

[11,2,[3,7],(68,-1),"123",9]

输出样例:
在这里给出相应的输出。例如:

99

代码

def a(s):
    sum1=0
    for i in s:
        if isinstance(i,int):
            sum1+=i
        elif isinstance(i,list):
            sum1+=a(i)
        elif isinstance(i,tuple):
            sum1+=a(i)
    return sum1
s=eval(input())
print(a(s))

7-4 列表数字元素加权和(1) (40分)

输入一个嵌套列表,嵌套层次不限,根据层次,求列表元素的加权和。第一层每个元素 的值为:元素值1,第二层每个元素的值为:元素值2,第三层每个元素的值为:元素值*3, …,以此类推!

输入格式:
在一行中输入列表

输出格式:
在一行中输出加权和

输入样例:
在这里给出一组输入。例如:

[1,2,[3,4,[5,6],7],8]

输出样例:
在这里给出相应的输出。例如:

72

代码

def a(s,n):
    sum1=0
    sum2=0
    for i in s:
        if isinstance(i,int):
            sum1+=i*n
        elif isinstance(i,list):
            sum2+=a(i,n+1)
    return sum1+sum2
s=eval(input())
print(a(s,1))

7-5 列表元素个数的加权和(1) (40分)

输入一个嵌套列表,嵌套层次不限,根据层次,求列表元素的加权个数和。第一层每个元素算一个元素,第二层每个元素算2个元素,第三层每个元素算3个元素,第四层每个元素算4个元素,…,以此类推!

输入格式:
在一行中输入一个列表。

输出格式:
在一行中输出加权元素个数值。

输入样例:
在这里给出一组输入。例如:

[1,2,[3,4,[5,6],7],8]

输出样例:
在这里给出相应的输出。例如:

15

代码

def a(s,n):
    sum1=0
    sum2=0
    for i in s:
        if isinstance(i,int):
            sum1+=1*n
        elif isinstance(i,list):
            sum2+=a(i,n+1)
    return sum1+sum2
s=eval(input())
print(a(s,1))

7-6 求指定层的元素个数 (40分)

输入一个嵌套列表,再输入层数,求该层的数字元素个数。

输入格式:
第一行输入列表 第二行输入层数

输出格式:
在一行中输出元素个数

输入样例:
在这里给出一组输入。例如:

[1,2,[3,4,[5,6],7],8]
3

输出样例:
在这里给出相应的输出。例如:

2

代码

def a(s,n,m):
    sum1=0
    sum2=0
    for i in s:
        if isinstance(i,list):
            sum2=a(i,n,m+1)
        elif isinstance(i,int):
            sum1+=1
    if n == m:
        return sum1
    else:
        return sum2
s=eval(input())
n=int(input())
sum1=a(s,n,1)
print(sum1)

7-7 找出总分最高的学生 (15分)

给定N个学生的基本信息,包括学号(由5个数字组成的字符串)、姓名(长度小于10的不包含空白字符的非空字符串)和3门课程的成绩([0,100]区间内的整数),要求输出总分最高学生的姓名、学号和总分。

输入格式:
输入在一行中给出正整数N(≤10)。随后N行,每行给出一位学生的信息,格式为“学号 姓名 成绩1 成绩2 成绩3”,中间以空格分隔。

输出格式:
在一行中输出总分最高学生的姓名、学号和总分,间隔一个空格。题目保证这样的学生是唯一的。

输入样例:

5
00001 huanglan 78 83 75
00002 wanghai 76 80 77
00003 shenqiang 87 83 76
10001 zhangfeng 92 88 78
21987 zhangmeng 80 82 75

输出样例:

zhangfeng 10001 258

代码

s=int(input())
data=[]
max=0
sum1=0
flag=-1
for i in range(s):
    data.append(input().split())
for i in range(s):
    for j in range(2,5):
        sum1+=int(data[i][j])
    if sum1 > max :
        max=sum1
        flag=i
    sum1=0
print("%s %s %s"%(data[flag][1],data[flag][0],max))

7-8 *6-7 输出全排列 (20分)

请编写程序输出前n个正整数的全排列(3<=n<=7),按字典序输出。

输入格式:
一行输入正整数n。

输出格式:
按字典序输出1到n的全排列。每种排列占一行,数字间无空格。

输入样例:
在这里给出一组输入。例如:

3

输出样例:
在这里给出相应的输出。例如:

123
132
213
231
312
321

代码

import random
def f(n):
    a=1
    for i in range(1,n+1):
        a*=i
    return a
n=int(input())
data=[str(i) for i in range(1,n+1)]
s=set()
while len(s) < f(n):
    random.shuffle(data)
    s.add("".join(data))
s=sorted(s)
for i in s:
    print(i)

你可能感兴趣的:(PTA)