SDUT—Python程序设计实验7&8(函数)

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

给定两个均不超过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):
    return sum([int('1' * i) * a for i in range(1, n + 1)])

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

设计函数,求指定范围内的素数之和。
函数1:prime§, 用户传入参数p,若它为素数时返回True,否则返回False.
函数2:PrimeSum(m,n),返回区间[m, n]内所有素数的和(其中,1<=m<n)。
函数接口定义:

prime( p ),返回True表示p是素数,返回False表示p不是素数;
PrimeSum(m,n),函数返回素数之和。

在这里解释接口参数。例如:其中 N 和 D 都是用户传入的参数。 N 的值不超过int的范围; D 是[0, 9]区间内的个位数。函数须返回 N 中 D 出现的次数。
裁判测试程序样例:

/* 请在这里填写答案 */
m,n=input().split()
m=int(m)
n=int(n)
print(PrimeSum(m,n))

输入样例:

1 10

输出样例:

17

代码:

def prime(p):
    if p == 0 or p == 1:
        return False
    for i in range(2, int(p ** 0.5) + 1):
        if p % i == 0:
            return False
    return True

def PrimeSum(m, n):
    return sum([i for i in range(m, n + 1) if prime(i) is True])

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

设计函数,统计数字字符在某数字中出现的个数。
函数接口定义:

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 2 in "+str(number)+":",count)

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

-21252 2

输出样例:

Number of digit 2 in -21252: 3

代码:

def CountDigit(number, digit):
    return str(number).count(str(digit))

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

设计函数实现:计算第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

代码:

Fib = [1, 1]

def fib(n):
    if n == 0 or n == 1: return 1
    return fib(n - 1) + fib(n - 2)

def fibs(a, b):
    while (Fib[-1] <= b):
        Fib.append(Fib[-1] + Fib[-2])
    return [t for t in Fib if a <= t <= b]

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

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

acronym(phrase);

参数:phrase是字符串短语,函数返回:短语的缩写词。
裁判测试程序样例:

/* 请在这里填写答案 */
phrase=input()
print(acronym(phrase))

输入样例:

central  processing  unit

输出样例:

CPU

代码:

def acronym(phrase):
    txt = ""
    for c in [s[0] for s in list(phrase.title().split())]:
        txt += c
    return txt

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

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(ls_a):
    return [(sum(it) / len(it) * 1.0) for it in ls_a]

7-1 sdut-求全排列

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

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

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

输入样例:

3

输出样例:

123
132
213
231
312
321

代码:

from itertools import *
def per(num):
    for s in permutations([int(x) for x in range(1, num + 1)]):
        for it in str(s):
            if it.isdigit():
                print(it, end='')
        print()

n = int(input())
per(n)

7-2 sdut-列表元素个数的加权和(1)

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

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

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

输入样例:

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

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

15

代码:

def cycle(s, cnt):
    sum = 0
    for it in s:
        if isinstance(it, int):
            sum += cnt
        elif isinstance(it, list):
            sum += cycle(it, cnt + 1)
    return sum

s, cnt = eval(input()), 1
print(cycle(s, cnt))

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

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

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

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

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

输入样例:

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

输出样例:

72

代码:

def cycle(s, cnt):
    sum = 0
    for it in s:
        if isinstance(it, int):
            sum += it * cnt
        elif isinstance(it, list):
            sum += cycle(it, cnt + 1)
    return sum

s, cnt = eval(input()), 1
print(cycle(s, cnt))

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

求列表中数字和,列表中嵌套层次不限。
输入格式:
在一行中输入列表或元组。

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

输入样例:

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

输出样例:

99

代码:

def cycle(s):
    sum = 0
    for it in s:
        if isinstance(it, int):
            sum += it
        if isinstance(it, list):
            sum += cycle(it)
        if isinstance(it, tuple):
            sum += cycle(it)
    return sum

s = eval(input())
print(cycle(s))

7-5 sdut-验证“哥德巴赫猜想”

著名的“哥德巴赫猜想”的大致意思是:任何一个大于2的偶数总能表示为两个素数之和。比如:24=5+19,其中5和19都是素数。本实验的任务是设计一个程序,验证20亿以内的偶数都可以分解成两个素数之和。

输入格式:
在一行中,给出一个(2, 2 000 000 000]范围内的偶数N。

输出格式:
在一行中,按照格式“N=p+q”输出N的素数分解,其中p ≤ q均为素数。又因为这样的分解不唯一(例如:24还可以分解为7+17),要求必须输出所有解中p最小的解。

输入样例:

24

输出样例:

24=5+19

代码:

def prime(p):
    if p == 0 or p == 1:
        return False
    for i in range(2, int(p ** 0.5) + 1):
        if p % i == 0:
            return False
    return True

n = int(input())
for i in range(2, n):
    if prime(i) and prime(n - i):
        print("%d=%d+%d" % (n, i, n - i))
        exit()

7-6 sdut-学生互助组队

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

输入格式:
第一行给出正偶数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 = [], [], []
n = int(input())
for i in range(n):
    id, name = input().split()
    if id == '0':
        ls_w.append(name)
    else:
        ls_m.insert(0, name)
    ls.append(name)
dic1, dic2 = dict(zip(ls_w, ls_m)), dict(zip(ls_m, ls_w))
for i in range(len(ls) // 2):
    if ls[i] in dic1.keys():
        print(ls[i], dic1[ls[i]])
    else:
        print(ls[i], dic2[ls[i]])

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

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

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

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

输入样例:

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

输出样例:

2

代码:

dic = {}
s = eval(input())
n = int(input())
def cycle(s, n):
    for it in s:
        dic[n] = dic.get(n, 0) + 1
        if isinstance(it, list):
            cycle(it, n + 1)

cycle(s, 1)
print(dic.get(n, 0))

因为这学期刚学Python,就当是做个笔记了,代码虽然都能过,但可能不是特别好,有不当的地方欢迎指正,感谢大家的耐心阅读
212丨acc丨2022.11.18

  • 4
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值