Python习题三

491 阅读2分钟

6-1 python函数-组合数

请编写函数完成:从n个元素中取出m个元素的组合数:参考公式

image.png

输入要求:n和m均为正整数;如果输入非法数据请参照下方输入输出样例的警告信息;

函数接口定义:

定义两个函数,函数名及参数要求如下:
Fun_Fact(x)                   #定义阶乘函数,对x求阶乘
Fun_Comb ( m, n)             #调用阶乘函数,使用题目公式,再设计函数计算组合数

其中'x' 、'n' 和 'm'都是用户传入的参数。x、 n和m 的值均为正整数;且 n>=m;第二个函数Fun_Comb ( n, m ) 须返回组合数个数。

裁判测试程序样例:

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

 
 
a,b = input().split(',')
if a.isdecimal() and b.isdecimal() and (int(a)<=int(b)):
    Comb_Result = Fun_Comb(int(a), int(b))
    print("result={:.2f}".format(Comb_Result))
else:
    print("Error data,please input again!")

输入样例1:

2,7

输出样例1:

result=21.00

输入样例2:

4,-10

输出样例2:

Error data,please input again!

代码长度限制 16 KB

时间限制 400 ms

内存限制 64 MB

参考答案

#方法一
def Fun_Fact(x):
    sum = 1
    for i in range(1, x + 1):
        sum *= i
    return sum

def Fun_Comb(m, n):
    sum = Fun_Fact(n) / (Fun_Fact(m) * Fun_Fact(n - m))
    return sum
#方法二
def Fun_Fact(x):
    if x==0 or x==1:
        return 1
    else:
        return x*Fun_Fact(x-1)
def Fun_Comb (m,n):
    return Fun_Fact(n)/Fun_Fact(m)/Fun_Fact(n-m)

6-2 写函数判断质数

实现一个函数,判断参数是否是质数,是的话返回True,否则返回False

函数接口定义:

def isPrime(num);

参数num表示要判断的正整数。返回值为True表示是质数,返回False表示不是质数。

裁判测试程序样例:

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

num=eval(input())
if isPrime(num):
    print ('yes')
else:
    print ('no')

输入样例:

97

输出样例:

yes

代码长度限制 16 KB

时间限制 400 ms

内存限制 64 MB

参考答案

#方法一
def isPrime(num):
    if num == 1 or num == 0:
        return False
    elif num == 2:
        return True
    else:
        for i in range(2, int(num ** 0.5) + 1):
            if num % i == 0:
                return False
        return True
#方法二
def isPrime(num):
    if num==1:
        return False
    elif 0 in [0 for i in range(2,int(pow(num,0.5))+1) if num%i==0]:
        return False
    else:
        return True

6-3 编写函数统计指定数字的个数

6-3 编写函数统计指定数字的个数

CountDigit(number,digit )

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

函数接口定义:

函数接口定义:

int CountDigit (number, digit );

参数number是整数,参数digit为[1,9]区间的整数,函数返回number中digit出现的次数。

裁判测试程序样例:

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

number,digit = list(map(int,input().split()))
cnt = CountDigit(number,digit)
print ("Number of digit {0} in {1}: {2}".format(digit,number,cnt))

输入样例:

-21252 2

输出样例:

Number of digit 2 in -21252: 3

代码长度限制 16 KB

时间限制 400 ms

内存限制 64 MB

参考答案

#方法一
def CountDigit(number, digit):
    n = str(digit)
    return str(number).count(n)
#方法二
def CountDigit(number,dight):
    nums=str(number)
    cnt=nums.count(str(dight))
    return cnt

6-4 修改句子

本题参考checkio.org

读入一个英文句子,将此句子的第一个字母改为大写字母,并在最后加上句号'.'

注意:读入的句子有可能本来就符和要求。

函数接口定义:

def fun(sentence):

裁判测试程序样例:

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


doc = input()
res = fun(doc)
print(res)

输入样例1:

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

hello, world

输出样例1:

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

Hello, world.

输入样例2:

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

Hello, world.

输出样例2:

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

Hello, world.

代码长度限制 16 KB

时间限制 400 ms

内存限制 64 MB

参考答案

#方法一
def fun(sentence: str):
    str1 = sentence.capitalize()
    if sentence[len(sentence) - 1] != '.':
        str1=str1+'.'
    return str1
 
#方法二
def fun(sentence):
    if sentence[-1]==".":
        return sentence.capitalize()
    else:
        return sentence.capitalize()+"."

6-5 整数数位和

编写一个函数,该函数接受一个正整数作为参数,返回该整数的各位数字之和。

函数接口定义:

def digitSum(v)

v为输入整数(正整数);
函数返回一个整数,其值为v的各位数字之和。

裁判测试程序样例:

a = int(input())
print(digitSum(a))

输入样例:

291

输出样例:

12

代码长度限制 16 KB

时间限制 400 ms

内存限制 64 MB

参考答案

#方法一
def digitSum(v):
    sum=0
    for i in str(v):
        sum += int(i)
    return sum
#方法二
def digitSum(v):
    return sum(map(int,str(v)))

7-1 计算各对应位乘积之和

读入两个整数a和b,输出绝对值a和绝对值b的各对应位乘积之和,如a=1234,b=608,则输出值为:“1×0+2×6+3×0+4×8“的值,即44。

输入格式:

在一行中输入两个数

输出格式:

在一行中输出对应位乘积之和

输入样例:

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

1234 608

输出样例:

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

44

代码长度限制 16 KB

时间限制 400 ms

内存限制 64 MB

参考答案

#方法一
n,m=map(int, input().split())
n,m=str(abs(n)),str(abs(m))
long=max(len(n),len(m))
sum=0
while len(n) < long:
    n='0'+n
while len(m) < long:
    m='0'+m
for i in range(long):
    sum+=int(n[i])*int(m[i])
print(sum)
#方法二
a,b=input().split()
a=str(abs(int(a)))
b=str(abs(int(b)))
if len(a)-len(b)>0:
    b="0"*(len(a)-len(b))+b
else:
    a="0"*(len(b)-len(a))+a
print(sum([int(a[i])*int(b[i]) for i in range(len(a))]))

7-2 缩写期刊名

科研工作者经常要向不同的期刊投稿。但不同期刊的参考文献的格式往往各不相同。有些期刊要求参考文献所发表的期刊名必须采用缩写形式,否则直接拒稿。现对于给定的期刊名,要求按以下规则缩写:
(1)长度不超过4的单词不必缩写;
(2)长度超过4的单词仅取前4个字母,但其后要加“.”;
(3)所有字母都小写。

输入格式:

首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。
每组测试输入一个包含大小写字母和空格的字符串(长度不超过85),单词由若干字母构成,单词之间以一个空格间隔。

输出格式:

对于每组测试,在一行上输出缩写后的结果,单词之间以一个空格间隔。

输入样例:

2
Ad Hoc Networks
IEEE Transactions on Nanotechnology

输出样例:

ad hoc netw.
ieee tran. on nano.

代码长度限制 16 KB

时间限制 400 ms

内存限制 64 MB

参考答案

#方法一
n = int(input())
for t in range(n):
    l1 = input().split()
    for i in range(len(l1)):
        if len(l1[i]) > 4:
            print(l1[i][:4].lower(), end='.')
        else:
            print(l1[i].lower(), end='')
        if i < len(l1) - 1:
            print(" ", end='')
    print()
    l1.clear()
#方法二
n=int(input())
for i in range(n):
    lst=input().split()
    for i in range(len(lst)):
        x=lst[i].lower()
        if len(x)>4:
            lst[i]=x[:4]+"."
        else:
            lst[i]=x
    print(*lst)

7-3 小者靠前

输入n(1<n<100)个整数到一个数组中,使得其中最小的一个数成为数组的第一个元素(首元素)。若有多个最小者,则首元素仅与最早出现的最小者交换。

输入格式:

测试数据有多组,处理到文件尾。每组测试数据的第一行输入n(1<n<100),第二行输入n个整数。

输出格式:

对于每组测试,输出将这n个整数中最小的数与第一个数对换后的n个整数。

输入样例:

5
5 3 4 1 2

输出样例:

1 3 4 5 2

代码长度限制 16 KB

时间限制 400 ms

内存限制 64 MB

参考答案

#方法一
try:
    while True:
        n = int(input())
        list1 = [eval(i) for i in input().split()]
        min1 = min(list1)
        for i in range(n):
            if min1 == list1[i]:
                list1[i] = list1[0]
                break
        list1[0] = min1
        print(' '.join(str(i) for i in list1))
except EOFError:
    pass
#方法二
while True:
    try:
        n=input()
        lst=list(map(int,input().split()))
        a=lst[0]
        n=lst.index(min(lst))
        b=lst[n]
        lst[n],lst[0]=a,b
        print(*lst)
    except:
        break

7-4 Python-任意多行字符串拆分数值求和

编写程序,统计每行字符串中若干整数的和。每行字符串中整数间的分隔符可能有逗号“,”、分号“ ;”和空格,有多少行就求多少行。

输入格式:

任意输入若干行由整数构成的字符串(回车换行),整数间以逗号或空格或分号分隔。测试数确保至少有一行数据,字符串中的整数数据均合法有效。最后以一个回车结束输入。

输出格式:

对应输出原输入串(一行中的字符序列),冒号后输出各个整数之和。

输入样例:

1; 2 ,3
2 3; 4
10,20 30; 40
 9

输出样例:

1; 2 ,3:6
2 3; 4:9
10,20 30; 40:100
 9:9

代码长度限制 16 KB

时间限制 400 ms

内存限制 64 MB

参考答案

#方法一
try:
    while True:
        s1=input()
        s2=''
        for i in s1:
            if i.isdigit():
                s2+=i
            else:
                s2+=' '
        l1=list(map(int,s2.split()))
        print("%s:%s"%(s1,sum(l1)))
except EOFError:
    pass
#方法二
while True:
    try:
        x=input()
        lst=x.replace(","," ").replace(":"," ").replace(";"," ").split()
        print(x+":"+str(sum(map(int,lst))))
    except:
        break

7-5 武林盟主

在传说中的江湖中,各大帮派要选武林盟主了,如果龙飞能得到超过一半的帮派的支持就可以当选,而每个帮派的结果又是由该帮派帮众投票产生的,如果某个帮派超过一半的帮众支持龙飞,则他将赢得该帮派的支持。现在给出每个帮派的帮众人数,请问龙飞至少需要赢得多少人的支持才可能当选武林盟主?

输入格式:

测试数据有多组,处理到文件尾。每组测试先输入一个整数n(1≤n≤20),表示帮派数,然后输入n个正整数,表示每个帮派的帮众人数ai​(0<ai​≤100)。

输出格式:

对于每组数据输出一行,表示龙飞当选武林盟主至少需要赢得支持的帮众人数。

输入样例:

3 5 7 5
4 6 6 7 5

输出样例:

6
11

代码长度限制 16 KB

时间限制 400 ms

内存限制 64 MB

参考答案

#方法一
try:
    while True:
        list1 = list(map(int, input().split()))
        list2 = []
        for i in range(1, list1[0] + 1):
            list2.append(list1[i] // 2 + 1)
        while len(list2) > list1[0] // 2 + 1:
            list2.remove(max(list2))
        print(sum(list2))
except EOFError:
    pass
#方法二
while True:
    try:
        x=list(map(int,input().split()))
        lst=sorted(x[1:])
        l=len(lst)//2+1
        print(sum([i//2+1 for i in lst[:l]]))
    except:
        break