函数题

6-1 sdut-使用函数求a+aa+aaa++⋯+aa.....aaa(n个a)之和。

分数 10

作者 周雪芹

单位 山东理工大学

给定两个均不超过9的正整数a和n,要求:编写函数fn(a,n), 求a+aa+aaa++⋯+aa⋯aa(n个a)之和,fn须返回的是数列之和。

函数接口定义:

def 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):
    # 添加进sum的第一个数是a1
    a1=a
    sum=0
    for i in range(1,n+1):
        sum+=a1
        # 上一个a1加入到sum后,才能有下一个a1
        a1=a1*10+a
    return sum

6-2 sdut-使用函数求区域内的素数之和

分数 10

作者 周雪芹

单位 山东理工大学

设计函数,求指定范围内的素数之和。

函数1:prime(p), 用户传入参数p,若它为素数时返回True,否则返回False.

函数2:PrimeSum(m,n),返回区间[m, n]内所有素数的和(其 中,1<=m<n)。

函数接口定义:

prime(p),返回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):
    # 素数定义为>1的自然数,所以p<2时False
    if p<2:
        return False
    # 如果p为合数,则一定存在一个≤根号下p的因数
    # range()只接受整数参数,所以要int()
    for i in range(2,int( p**0.5 )+1):
        # 如果p能整除i,那么False
        if p%i==0:
            return False
    # 其他情况就返回True
    return True
        
def PrimeSum(m,n):
    sum=0
    for i in range(m,n+1):
        if prime(i):
            sum+=i
    return sum
    #函数返回素数之和。

6-3 sdut-使用函数统计数字字符在某数字中出现的个数

分数 10

作者 周雪芹

单位 山东理工大学

设计函数,统计数字字符在某数字中出现的个数。

函数接口定义:

CountDigit(number,digit )

其中,number是整数,digit为[1, 9]区间内的整数数值;返回number中digit出现的次数。

裁判测试程序样例:

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

number,digit=input().split()

number=int(number)

digit=int(digit)

count=CountDigit(number,digit )

print("Number of digit {} in {}:{}".format(digit, number, count))

输入样例:

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

-21252 2

输出样例:

Number of digit 2 in -21252: 3

答案:

def CountDigit(number,digit ):
    # count()方法只对字符串有用,所以要把两者转换为str()
    s1=str(number)
    s2=str(digit)
    n=s1.count(s2)
    return n 

6-4 sdut-使用函数输出Fibonacci数列的值与指定范围内Fibonacci数值的个数

分数 10

作者 周雪芹

单位 山东理工大学

设计函数实现:计算第n项Fibonacci数列数值,并求出两正整数a和b所组成的闭区间[a,b](0<a<b≤100000)之间的所有Fibonacci数的数目。

Fibonacci数列,任一项数字是前两项的和(最开始两项均定义为1)的数列, fib(0)=fib(1)=1

函数接口定义:

fib(n) #函数1

fibs(a, b) #函数2

fib(n):返回第n项Fibonacci数;

fibs(a, b):返回 [a, b] 中的所有Fibonacci数组成的列表。

n、a、b均为正整数。

裁判测试程序样例:

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

n,a,b=input().split()

n=int(n)

a=int(a)

b=int(b)

fb=fib(n)

print("fib({0}) = {1}".format(n,fb))

fiblist=fibs(a, b)

print(len(fiblist))

输入样例:

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

6 20 100

输出样例:

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

fib(6) = 13

4

答案:

def fib(n):
    # 最开始两项均为1
    if n==0 or n==1:
        return 1
    # 设置两个变量a,b,分别是指向相邻的数的指针
    # 最开始指向f(0)和f(1),所以都是1
    a,b=1,1
    for i in range(2,n+1):
        # 每个数都是前两项的和,往后移1个数
        # 必须同时赋值!
        a,b=b,a+b
    # b就是需要求的第n个F数
    return b
#函数1

def fibs(a, b):
    l=[]
    # n代表计数器,表示第n个数
    # n最开始是第0个数
    n=0
    # 因为不知道循环范围,所以用while
    while True:
        # num(第n个F数)的范围应在[a,b]
        num=fib(n)
        # 注意判断顺序,要保证num≤a时循环继续,num>b则立即跳出循环
        if num>b:
            break
        if num>=a:
            l.append(num)
        # 每次结束后n+1
        n+=1
    return l

6-5 sdut-利用函数得到缩写词

分数 10

作者 周雪芹

单位 山东理工大学

缩写词是由一个短语中每个单词的第一个字母组成,均为大写。

例如,CPU是短语“central processing unit”的缩写。

函数接口定义:

acronym(phrase);

参数:phrase是字符串短语,函数返回:短语的缩写词。

裁判测试程序样例:

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

phrase=input()

print(acronym(phrase))

输入样例:

central processing unit

输出样例:

CPU

答案:

def acronym(phrase):
    # 把输入按空格分隔开,成为一个个单词,并化为列表
    l=list(phrase.split())
    # 初始化一个空字符串,进行字符串拼接,并存储最终结果
    s=''
    # 对l内的每一部分进行循环
    for i in l:
        # 每个单词的首字母是i[0]
        s+=i[0]
    # 将整个字符串转为大写
    s=s.upper()
    return s

6-6 sdut-求嵌套列表的平均值

分数 10

作者 周雪芹

单位 山东理工大学

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):
    # 设置一个空列表,存储每个元素的平均值
    l=[]
    # 对每个lst的子列表进行循环
    for i in lst:
        # 计算每个子列表的平均值并加入l
        l.append( sum(i)/len(i) )
    return l

编程题

7-1 sdut-求全排列

分数 10

作者 周雪芹

单位 山东理工大学

输入整数n(3<=n<=7),编写程序输出1,2,...,n整数的全排列,按从小到大的顺序输出。

提示:求全排列的过程定义为一个函数,输入参数为包含n个元素的列表,返回值为包含全排列的列表。

输入格式:

在一行内,输入正整数n。

输出格式:

按数值从小到大的顺序输出1到n的全排列。每种排列占一行,数字间无空格。

输入样例:

3

输出样例:

123

132

213

231

312

321

答案:

# itertools是Python自带的工具箱
# 其中的permutations专门用来生成全排列
from itertools import*
n=int(input())
# 将1到n的数字加入至列表中,转换为列表元素的全排列
l=[]
for i in range(1,n+1):
    # 注意转换格式
    l.append(int(i))

# 生成全排列
for i in permutations(l):
    # 需要把格式转换为字符串
    # 对于每个排列结果中的每个数字
    for s in str(i):
        # 确保输出的是数字字符
        if s.isdigit():
            # 数字间不应有空格
            print(s,end='')
    # 换行
    print()

7-3 sdut-列表数字元素加权和(2)

分数 10

作者 周雪芹

单位 山东理工大学

输入一个嵌套列表,嵌套层次不限,根据层次,求列表元素的加权和。

第一层每个元素 的值为:元素值*1,第二层每个元素的值为:元素值*2,第三层每个元素的值为:元素值*3, ...,以此类推!

输入格式:

在一行中输入列表。

输出格式:

在一行中输出元素加权之和。

输入样例:

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

输出样例:

72

答案:

# ls:要处理的列表
# cnt:当前是第几层
def a(ls,cnt):
    sum=0
    # 逐个查看列表里的元素
    for i in ls:
        # 判断当前元素是不是列表,如果是列表,就要拆开(函数一次)
        if isinstance(i,list):
            # 进入了新的列表,层数+1
            sum+=a(i,cnt+1)
        # 不是列表,就直接添加
        else:
            sum+=i*cnt
    return sum
# eval()可以将python输入转换为真正的表达式
l=eval(input())
# 从第一层开始
print(a(l,1))

7-4 sdut-列表或元组的数字元素求和(yeild)

分数 10

作者 周雪芹

单位 山东理工大学

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

输入格式:

在一行中输入列表或元组。

输出格式:

在一行中输出数字的和。

输入样例:

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

输出样例:

99

答案:

# ls是要处理的列表
def a(ls):
    sum=0
    # 对于ls的每部分
    for i in ls:
        # 若i为列表,递归处理
        if isinstance(i,list):
            sum+=a(i)
        # 若i为元组tuple(带圆括号()的),递归处理
        elif isinstance(i,tuple):
            sum+=a(i)
        # 若i为数字,直接添加
        elif isinstance(i,int):
            sum+=i
    return sum

# eval()将python输入直接转换为表达式
l=eval(input())
print(a(l))

7-6 sdut-学生互助组队

分数 10

作者 周雪芹

单位 山东理工大学

“一对一学习互助小组”是中小学中常见的学习组织方式,老师把学习成绩靠前的学生跟学习成绩靠后的学生排在一组。

请你编写程序帮助老师完成这个分配工作,即:在得到全班学生的排名后,在当前尚未分组的学生中,将名次最靠前的学生与名次最靠后的异性学生分为一组。

输入格式:

第一行给出正偶数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

答案:

# ls_w:按输入顺序存放所有女生的名字
# ls_m:按输入顺序反方向存放所有男生名字
# ls:按输入顺序存放所有学生的名字
# 因为学生是按名次从高到低顺序给出的,所以把男生名字一翻转,就正好和女生对应了
ls_w,ls_m,ls=[],[],[]
n=int(input())
for i in range(n):
    # 每行按空格分为id和name
    id,name=input().split()
    if id=='0':
        # 女生正序添加,用append
        ls_w.append(name)
    elif id=='1':
        # 男生反序添加,用insert
        ls_m.insert(0,name)
    # 无论男生女生,都要正序加入到ls
    ls.append(name)
# 字典dic1女生为键,男生为值
# 字典dic2男生为键,女生为值
dic1=dict( zip(ls_w,ls_m) )
dic2=dict( zip(ls_m,ls_w) )
# 因为两两配对,所以实际循环次数是全体学生姓名个数的½
# range()需要整数,所以用//
num=len(ls)//2
for i in range(num):
    # 如果当前i是女生,就在dic1中找她的搭档
    if ls[i] in dic1.keys():
        print(ls[i],dic1[ls[i]])
    # 如果当前i是男生,就在dic2中找他的搭档
    elif ls[i] in dic2.keys():
        print(ls[i],dic2[ls[i]])

7-7 sdut-求指定层的元素个数

分数 10

作者 周雪芹

单位 山东理工大学

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

输入格式:

第一行输入列表,第二行输入层数。

输出格式:

在一行中输出元素个数。

输入样例:

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

3

输出样例:

2

答案:

# ls:要处理的列表
# n:要求元素个数的层数(目标层)
# cnt:当前层,需要在函数外部调用,否则每次调用a时cnt都会被重置为1
def a(ls,n,cnt=1):
    # 元素个数
    num=0
    # 对于列表ls的每一层来说
    for i in ls:
        # 如果当前层就是目标层
        if cnt==n:
            num += 1
        # 如果当前层是列表,cnt+1
        if isinstance(i,list):
            # 递归统计子列表:进入这个列表继续找,要处理的列表变成了i,目标层数n不变,当前层数+1
            num+=a(i,n,cnt+1)
    return num
# eval()将输入转换成python表达式
l=eval(input())
n=int(input())
print(a(l,n))

7-6 sdut-oop-8 分数四则运算

分数 10

作者 周雪芹

单位 山东理工大学

定义类Fraction,在其中定义属性:numerator和denominator,分别表示分子和分母。

然定再定义两个分数的加、减、乘、除运算的方法。

在主类中输入2个分数,计算它们的四则运算结果。

提示:若用Python语言来实现,不必自行创建类,可直接使用 fractions模块处理分数的表示与运算。

输入格式:

第一行是整数N,表示待进行分数四则运算式子的数量。接下来包含N行输入。

每行数据是一个字符串,格式是"a/boc/d"。

其中a, b, c, d为数字(每个数字保证在int类型范围内,为正数并且不存在正号)。o是运算符"+"或者"-","*",""。

输出格式:

对于每一行分数四则运算,输出一行计算结果。

注意:结果应符合书写习惯,没有多余的符号、分子、分母,并且化简至最简分数形式。

输入样例:

5

1/100+3/100

1/4-1/2

1/3-1/3

1/2*2/1

1/2\1/2

输出样例:

1/25

-1/4

0

1

1

答案:

# 直接使用fractions模块处理分数的表示与运算
from fractions import Fraction
n=int(input())
for i in range(n):
    s=input()
    # \需要转义->\\
    for o in '+-*\\':
        # 如果此行输入中有运算符,那么用运算符分隔开两个分数
        if o in s:
            l,r=s.split(o)
            # 将字符串转换为分数
            f1=Fraction(l)
            f2=Fraction(r)
            # 开始运算
            if o =='+':
                result=f1+f2
            elif o=='-':
                result=f1-f2
            elif o=='*':
                result=f1*f2
            else:
                result=f1/f2
    print(result)

7-7 sdut-分数加减法

分数 10

作者 周雪芹

单位 山东理工大学

编写一个程序,实现两个分数的加减法。

输入格式:

输入包含多行数据。

每行数据是一个字符串,格式是"a/boc/d"。

其中a, b, c, d是一个0-9的整数。o是运算符"+"或者"-"。

输出格式:

对于输入数据的每一行输出两个分数的运算结果。

注意:结果应符合书写习惯,没有多余的符号、分子、分母,并且化简至最简分数。

输入样例:

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

1/8+3/8

1/4-1/2

1/3-1/3

输出样例:

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

1/2

-1/4

0

答案:

from fractions import Fraction
# 不知道有多少行输入,所以用while
while True:
    # 要用try-except结构,因为不知道确切输出行数,try-except能让程序在捕捉到报错的程序结束信号时直接跳出循环
    try:
        s=input()
        for o in '+-':
            if o in s:
                l,r=s.split(o)
                f1=Fraction(l)
                f2=Fraction(r)
                if o=='+':
                    result=f1+f2
                else:
                    result=f1-f2
    except Exception:
        break
    print(result)

更多推荐