Bootstrap

Python习题十一

6-1 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

代码长度限制 16 KB

时间限制 400 ms

内存限制 64 MB

参考答案

#方法一
def fib(n):  # 函数1
    fibn = [1, 1]
    for i in range(2, n + 1):
        fib1 = fibn[i - 1] + fibn[i - 2]
        fibn.append(int(fib1))
    return fibn[n]

def fibs(a, b):  # 函数2
    i = 0
    sum_fib = []
    while True:
        if a <= fib(i) <= b:
            sum_fib.append(int(fib(i)))
        elif fib(i) > b:
            break
        i += 1
    return sum_fib
#方法二
def fib(n):
    f0,f1 = 1, 1
    if n<2:
        return f0
    else:
        fn=fib(n-1)+fib(n-2)
    return fn

def fibs(m,n):
    s = []
    i = 0
    while True:
        fn = fib(i)
        if n>=fn>=m:
            s.append(fn)
        elif fn > n:
            break
        i+=1
    return s

6-2 根据三角形三边长求面积,不能合法构成三角形则抛出异常

下述程序从键盘读入三角形的三边长(小数),然后使用海伦公式计算三角形的面积。如果输入的三边长可以构成合法的三角形,输出计算得到的三角形面积,否则输出"无法构成合法三角形"。

请将下述程序补充完整,请注意该程序中的错误输出依赖于Python的异常处理机制。

函数接口定义:

请将代码补全,完成相应的功能。
此处缺失的代码不是一个函数。

裁判测试程序样例:

from math import sqrt

def Area(a,b,c):
    p=(a+b+c)/2
    s=sqrt(p*(p-a)*(p-b)*(p-c))
    return s

ans=0
a = float(input())
b = float(input())
c = float(input())

#在此处补全代码
#try .... 
#...
#...

except ValueError:
    print("无法构成合法三角形")
else:
    print("%.2f" % ans)

输入样例:

3
3.1
10.8

输出样例:

无法构成合法三角形

代码长度限制 16 KB

时间限制 400 ms

内存限制 64 MB

参考答案

#方法一
try:
    p = (a + b + c) * 0.5
    c = (p * (p - a) * (p - b) * (p - c))
    ans = pow(c, 0.5)
    ans = str(ans)
    ans = float(ans)
#方法二
try:
ans=Area(a,b,c)

7-1 sdut-查字典

遇到单词不认识怎么办? 查字典啊!

已知字典中有n个单词,现有m个不认识的单词,询问这m个单词是否出现在字典中,如果在字典中就输出其含义,如果不在字典中,就输出:Not found!

输入格式:

含有多组测试用例。

第一行输入n,m (n>=0&&n<=100000&&m>=0&&m<=100000)分别是字典中存在的n个单词,和要查询的m个单词.

紧跟着n行,代表字典中存在的单词及其解释(含义);

然后m行,要查询的m个单词。

若n=0&&m=0 程序结束

输出格式:

对于待查询的单词,若在字典中存在则输出其解释(含义),不存在输出Not found!

输入样例:

3 2
red: having the colour of blood or fire
green:having the colour of grass or the leaves of most plants and trees
blue:having the colour of a clear sky or the sea/ocean on a clear day
blue
abcded
0 0

输出样例:

having the colour of a clear sky or the sea/ocean on a clear day
Not found!

代码长度限制 16 KB

时间限制 400 ms

内存限制 64 MB

参考答案

#方法一
while True:
    n, m = map(int, input().split())
    if n == 0 and m == 0:
        break
    dic = {}
    for i in range(n):
        d1, d2 = input().split(':')
        dic[d1] = d2
 
    for i in range(m):
        word = input()
        if word in dic:
            print(dic[word])
        else:
            print('Not found!')
#方法二
while True:
    try:
        n, m = map(int, input().split())
        dct = {}
        ls=[]
        for i in range(n):
            value, key = input().split(":")
            dct[value]=key
        for i in range(m):
            ls.append(input())
        for i in range(m):
            if dct.get(ls[i],0) != 0:
                print(dct[ls[i]])
            else:
                print("Not found!")
    except:
        break

7-2 集合添加元素

向集合中加入单一元素,可以使用.add() 方法操作,该操作将向集合中加入。
应用你的知识帮助你的好朋友小明,小明喜欢集邮,他有大量的来自不同国家的邮票,他决定数一下他的集邮册中共有来自多少个不同国家的邮票,他请你帮忙,你一个一个的把N张邮票拿出来,找出共有多少个不重复的国家。

输入格式:

第一行输入一个整数N,表示所有邮票的数目‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

接下来的N行,每行输入一张邮票来自哪一个国家的名字

输出格式:

在一行中输出不重复的国家的数量。

输入样例:

7
UK
China
USA
France
New Zealand
UK
France

输出样例:

5

代码长度限制 16 KB

时间限制 400 ms

内存限制 64 MB

参考答案

#方法一
n = int(input())
m = input()
list1 = {m}
for i in range(n - 1):
    list1.add(input())
print(len(list1))
#方法二
n=int(input())
s=set()
for i in range(n):
    s.add(input())
print(len(s))

7-3 集合应用–列表

集合是一个无序的、没有重复元素的数据类型,在输出或转为序列类型时,其元素位置随机出现。

李白是一个社区大学的老师,一天,他让学生小明计算一下温室里植物的平均高度。‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬
平均高度 = 不同高度的和 / 不同高度的数量

输入格式:

输入N 个用空格分隔的植物的高度

输出格式:

在一行内输出植物的平均高度,保留小数点后3位

输入样例:

161 182 161 154 176 170 167 171 170 174

输出样例:

169.375

代码长度限制 16 KB

时间限制 400 ms

内存限制 64 MB

参考答案

#方法一
lis1 = list(map(int, input().split()))
lis2 = list(set(lis1))
print("%.3f" % (sum(lis2) / len(lis2)))
#方法二
ls=set(map(int,input().split()))
print("{:.3f}".format(sum(ls)/len(ls)))

7-4 字典查询1–查询省会

总理有诗云:两湖两广两河山,五江云贵福吉安,四西二宁青甘陕,还有内台北上天。
中国各省、直辖市、自治区和特别行政区的字典数据如下:

capitals = {‘湖南’:‘长沙’,‘湖北’:‘武汉’,‘广东’:‘广州’,‘广西’:‘南宁’,‘河北’:‘石家庄’,‘河南’:‘郑州’,‘山东’:‘济南’,‘山西’:‘太原’,‘江苏’:‘南京’,‘浙江’:‘杭州’,‘江西’:‘南昌’,‘黑龙江’:‘哈尔滨’,‘新疆’:‘乌鲁木齐’,‘云南’:‘昆明’,‘贵州’:‘贵阳’,‘福建’:‘福州’,‘吉林’:‘长春’,‘安徽’:‘合肥’,‘四川’:‘成都’,‘西藏’:‘拉萨’,‘宁夏’:‘银川’,‘辽宁’:‘沈阳’,‘青海’:‘西宁’,‘海南’:‘海口’,‘甘肃’:‘兰州’,‘陕西’:‘西安’,‘内蒙古’:‘呼和浩特’,‘台湾’:‘台北’,‘北京’:‘北京’,‘上海’:‘上海’,‘天津’:‘天津’,‘重庆’:‘重庆’,‘香港’:‘香港’,‘澳门’:‘澳门’}

设计程序,接收用户输入的省、直辖市、自治区和特别行政区名称,输出对应的省会名称,当输入错误时输出“输入错误”。

输入格式:

第一行输入一个整数n

接下来输入n行,每行输入一个省、直辖市、自治区或特别行政区名称‪‬‪‬‪‬‪‬‪‬‮‬‪‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‪‬

输出格式:

输出对应的省会名称

输入样例1:

2
新疆
北京

输出样例1:

乌鲁木齐
北京

输入样例1:

1
美国

输出样例1:

输入错误

代码长度限制 16 KB

时间限制 400 ms

内存限制 64 MB

参考答案

#方法一
capitals = {'湖南': '长沙', '湖北': '武汉', '广东': '广州', '广西': '南宁', '河北': '石家庄', '河南': '郑州', '山东': '济南', '山西': '太原', '江苏': '南京',
            '浙江': '杭州', '江西': '南昌', '黑龙江': '哈尔滨', '新疆': '乌鲁木齐', '云南': '昆明', '贵州': '贵阳', '福建': '福州', '吉林': '长春',
            '安徽': '合肥', '四川': '成都', '西藏': '拉萨', '宁夏': '银川', '辽宁': '沈阳', '青海': '西宁', '海南': '海口', '甘肃': '兰州', '陕西': '西安',
            '内蒙古': '呼和浩特', '台湾': '台北', '北京': '北京', '上海': '上海', '天津': '天津', '重庆': '重庆', '香港': '香港', '澳门': '澳门'}
n = int(input())
for i in range(n):
    m = input()
    if m in capitals:
        print(capitals[m])
    else:
        print("输入错误")
#方法二
capitals = {'湖南':'长沙','湖北':'武汉','广东':'广州','广西':'南宁','河北':'石家庄','河南':'郑州','山东':'济南','山西':'太原','江苏':'南京','浙江':'杭州','江西':'南昌','黑龙江':'哈尔滨','新疆':'乌鲁木齐','云南':'昆明','贵州':'贵阳','福建':'福州','吉林':'长春','安徽':'合肥','四川':'成都','西藏':'拉萨','宁夏':'银川','辽宁':'沈阳','青海':'西宁','海南':'海口','甘肃':'兰州','陕西':'西安','内蒙古':'呼和浩特','台湾':'台北','北京':'北京','上海':'上海','天津':'天津','重庆':'重庆','香港':'香港','澳门':'澳门'}
n=int(input())
for i in range(n):
    s=input()
    if capitals.get(s,0)!=0:
        print(capitals[s])
    else:
        print("输入错误")

7-5 字典应用–用户登录

有字典如下:
dic = {‘admin’:‘123456’,‘administrator’:‘12345678’,‘root’:‘password’}
实现用户输入用户名和密码,当用户名与密码和字典中的键值对匹配时,显示“登录成功”,否则显示“登录失败”,登录失败时允许重复输入三次。

输入格式:

在两行中分别输入用户名和密码

输出格式:

“登录成功"或"登录失败”

输入样例:

admin
12345678
admin
123456

输出样例:

登录失败
登录成功

代码长度限制 16 KB

时间限制 400 ms

内存限制 64 MB

参考答案

#方法一
dic = {'admin': '123456', 'administrator': '12345678', 'root': 'password'}

def chance(m, n):
    global dic
    if m not in dic:  # 判断是否输入错误账号
        return 0
    if dic[m] == n:
        return 1
    return 0

n = input()
m = input()
if chance(n, m):
    print('登录成功')
else:
    print('登录失败')
    for i in range(2):
        n = input()
        m = input()
        if chance(n, m):
            print('登录成功')
            break
        else:
            print('登录失败')
#方法二
dic = {'admin':'123456','administrator':'12345678','root':'password'}
for i in range(3):
    name,password=input(),input()
    if dic.get(name,0) == password:
        print('登录成功')
        break
    else:
        print('登录失败')

7-6 列表操作

输入一个1-100之间的正整数 n, 以 n 为随机数种子随机生成一个不大于 n 的正整数 m 。 生成一个包含元素为 1,2,3……n 的列表 ls,在列表 ls 中删除值为 m 的整数倍的元素,在两行中输出原始列表和删除 m 倍数后的列表。

输入格式:

输入一个1-100之间的正整数 n

输出格式:

两行,每行一个列表

输入样例:

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

20

输出样例:

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

[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20]
[1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14, 16, 17, 18, 19]

代码长度限制 16 KB

时间限制 400 ms

内存限制 64 MB

参考答案

#方法一
import random
 
n = int(input())
ls = []
for i in range(1, n + 1):
    ls.append(i)
print(ls)
random.seed(n)
m = random.randint(1, n)
i = 1
while True:
    if m * i > n:
        break
    else:
        if m * i in ls:
            ls.remove(m * i)
    i += 1
print(ls)
#方法二
import random
n = int(input())
l = [i+1 for i in range(n)]
print(l)
random.seed(n)
m = random.randint(1,n+1)
print([i for i in l if i % m != 0])

7-7 奇特的四位数

一个四位数,各位数字互不相同,所有数字之和等于6,并且这个数是11的倍数。
满足这种要求的四位数有多少个?各是什么?

输入格式:

该题目没有输入

输出格式:

第一行输出符合条件的数字个数

第二行以列表形式输出所有满足条件的四位数,列表元素按由小到大顺序排列

输入样例:

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

输出样例:

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

6
[1023, 1320, 2013, 2310, 3102, 3201]

代码长度限制 16 KB

时间限制 400 ms

内存限制 64 MB

参考答案

#方法一
ls = []
for i in range(1000, 10000):
    if sum(list(map(int, str(i)))) == 6 and i % 11 == 0 and len(list(set(list(map(int, str(i))))))==4:
        ls.append(i)
print(len(ls))
print(ls)
#方法二
ans=[i for i in range(1000,10000) if sum(map(int,str(i)))==6 and len(set(str(i)))==4 and i % 11 == 0]
print(len(ans))
print(ans)

7-8 打印友好数

kekao 定义了一种数,叫做友好数。

对于友好数的定义是这样的:“对于一个正整数a,若a的每位数字加和为偶数,则a是一个友好数”。

已知区间l, r,求区间内所有的友好数。

输入格式:

输入两个正整数l,r 输入数据保证1<l<r<10^6

输出格式:

输出区间[l,r]中所有的友好数,友好数中间以空格间隔,若不存在友好数,输出0

输入样例:

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

3 5

输出样例:

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

4

代码长度限制 16 KB

时间限制 400 ms

内存限制 64 MB

参考答案

#方法一
a, b = map(int, input().split())
ls = []
for i in range(a, b + 1):
    if sum(list(map(int, str(i)))) % 2 == 0:
        ls.append(i)
if len(ls) == 0:
    print('0')
else:
    for i in range(len(ls) - 1):
        print(ls[i], end=' ')
    print(ls[len(ls) - 1], end='')
#方法二
a,b=map(int,input().split())
ls=[i for i in range(a,b+1) if sum(map(int,str(i)))%2==0]
if ls:
    print(*ls)
else:
    print(0)

;