c

codeye

V1

2022/11/05阅读:35主题:默认主题

Python编程挑战赛

题1:给小朋友分糖,每人分到糖的数量不同,输入小朋友的数量,计算至少需要多少糖?

思路:第1个小朋友1颗糖,第2个小朋友2颗糖,第3个小朋友3颗糖,……第n个小朋友n颗糖,计算1+2+……+n的和即可。

第1种写法:不用Python高级函数

n = int(input())
r = 0
for i in range(1, n + 1):
    r = r + i
print(r)

第2种写法:用Python高级函数


def splitcandy(n):
    return sum(list(range(1,n+1)))
    
n = 10
print(splitcandy(n))

题2:韩信点兵

一队士兵,3个一数多2人,5个一数多3人,7个一数多2人,问总共有多少人?输入一个数字n,判断在1~n之间有多少满足要求的数字。

第1种写法:不用函数

n = int(input())
for i in range(n):
    if i % 3 == 2 and i % 5 == 3 and i % 7 == 2:
        print(i)

第2种写法:函数并数组输出

def hanxin(n):
    ans = []
    for i in range(n):
        if i % 3 == 2 and i % 5 == 3 and i % 7 == 2:
            ans.append(i)
    return ans

题3:小明家里有很多不同的趣味书籍,有3个好朋友每人来借一本书(同一本书一次不能借给两个人)

任意输入书籍的数量n(3<=n<=100),输出在所有的书籍中,找3本书给3个人有多少种不同的排列组合方法。

【输入样例】 3 【输出样例】 6

排列组合问题

n = int(input())
print(n * (n - 1) * (n - 2))

题4:情报员使用4位数字来传递信息,同时为了防止信息泄露,需要将数字进行加密。数据加密的规则是:

  1. 每个数字都进行如下处理:该数字加上5之后除以10的余数,替换原数字;
  2. 将处理后第一位数字与第三位数字进行交换,第二位数字与第四位数字进行交换。

现在任意输入一个四位数n(1000<=n<=9999),输出加密之后的数字。

第1种写法:用Python高级函数

def encode(n):
    #step 1st str->int
    nseq = [(int(i)+5)%10 for i in str(n)]
    print(nseq)
    
    #step 2nd
    nseq[0], nseq[2] = nseq[2],nseq[0]
    nseq[1], nseq[3] = nseq[3], nseq[1]
    return ''.join(list(map(str,nseq)))
    
n = 1234
print(encode(n))

第2种写法:不用Python高级函数

n = 1234
r = ""
for a  in str(n):
    r = r + str((int(a) + 5) % 10)

r = r[2]+r[3]+r[0]+r[1]
print(int(r))

题5:我们在寄信的时候都要贴邮票,在邮局有一些小面值的邮票,通过这些小面值邮票中的一张或者几张的组合,可以满足不同邮件的不同邮资。

已知每个信封上最多能贴5张邮票,至少包含3种面值的邮票。任意输入一个数字n代表邮票的种类,然后依次输入n个数字代表不同种类的邮票面值,计算并输出每个信封上可以构成的邮资的最大值。

【输入样例】n=5

4

1

2

3

4

【输出样例】17

推荐写法:高级函数+集合 重要的原则是不要损失输入参数的完整!

每一封信贴的邮票数量maxs可以灵活设定,不一定是 5 每一封信邮票的面额种类mintype

def stamps(arr,maxs,mintype):#len(arr) = n
    arrs = sorted(set(arr),reverse=True)[:mintype]
    return sum(arrs) + arrs[0]*(maxs-mintype)
arr = [4,1,2,3,4]
maxs,mintype = 5,3
print(stamps(arr,maxs,mintype))

比较下面的写法优劣,下面的写法有几个问题:

1、remove()命令破坏了输入参数的完整 2、上面的写法灵活应对参数应需求的变化:

例如每一封信贴的邮票数量maxs可以灵活设定(不一定是 5) 每一封信邮票的面额种类mintype可以灵活初始化;

n = int(input())
youpiao = []
for i in range(n):
    youpiao.append(int(input()))

max1 = max(youpiao)
youpiao.remove(m1)
max2 = max(youpiao)
youpiao.remove(m2)
max3 = max(youpiao)

print(max1 * 3 + max2 + max3)

不建议上面的写法

题6:一个箱子里面存放着50个球,其中10个红色,10个黄色,30个蓝色。现在从箱子里面任意取n个球,计算并输出不同颜色的球的数量组合一共有多少种可能性。

【输入样例】 2 【输出样例】 6

题6讲解拓展到三原色组合为不同颜色的效果

def combin_rby(r,b,y,n):
    cunt = 0
    for i in range(r):
        for j in range(b):
            for m in range(y):
                if i + j + m == n:
                    cunt += 1
    return cunt
    
  
r, b, y, n, total = 10,10,30,2
print('rby: ',combin_rby(r,b,y,n))

6

三原色的比例不同,颜色不同看参见以前颜色表达链接

题7:依次输入一个字符串s与一个数字n,寻找字符串中所有连续出现n次的字符,统计符合要求的字符数量并输出:例如输入abbcccdddd,输入2,字符串中连续出现2次的字符包括b、c、d这3种

【输入样例】

abbcccdddd

2

【输出样例】3

写法1 函数

def repeat(strng,n):
    cunt = 0
    for c in set(list(strng)):
        if c*n in strng:
            cunt += 1
    return cunt
strng,n = 'abbcccdddd',2
print(repeat(strng,n))

写法2 思路一致

s = input()
n = int(input())
cc = set(s)
r = 0
for c in cc:
    if c * n in s:
        r = r + 1
print(r)

题8:当数字的位数高达上百位时,这样庞大的数字在计算机中的计算已经完全不能用简单的加减乘除来实现了,但是有时候对于这种高精度数字的处理也是编程中必不可缺的。

任意输入一个数字n(99999<n<999999),计算n的n次方(即连续n个n相乘)计算之后,最后的3位数字是多少?

【输入样例】 123456 【输出样例】 856

n = int(input())
n = n ** n
a = n % 10
b = n % 100 // 10
c = n % 1000 // 100
print(str(c * 100 + b * 10 + a))

题9:一群渔民被海盗抓住了,依次坐在编号为1~n的凳子上,其中有一个人身上有藏宝图。现在海盗想要找那个身上带着宝藏的渔民,海盗先将1号凳子上面的人搜身,没找到就隔1个凳子,将3号凳子上面的人搜身,没找到就隔2个凳子,将6号凳子上面的人搜身。以后每次多隔一个凳子去搜索……这样下去找了100次没找到,最终放弃了把渔民释放了。任意输入一个数字n(5<=n<=20)代表渔民的数量,依次输出哪些编号的渔民不会被搜身。

【输入样例】 10

【输出样例】 [2, 4, 7, 9]

写法1

def notFind(n):
    seat = [1] * n
    idx = 0
    for d in range(2,103): #100 steps
        seat[idx] = 0
        idx = (idx+d) % n
    return [i+1 for i,e in enumerate(seat) if e==1]

n = 10
print(notFind(n))

写法2

n = int(input())
lst = [0] * n
jiange = 1
suoyin = 0
c = 0
while 1:
    lst[suoyin % n] = 1
    jiange = jiange + 1
    suoyin = suoyin + jiange
    c = c + 1
    if c == 100:
        break
for i in range(n):
    if lst[i] == 0:
        print(i + 1)

题10:学校举办亲子运动会,所有的父亲一组,孩子一组,出场规则是:父亲组先派一个人上场之后孩子组才能派一个人上场,假设每队3对父子,可能的出场策略包括5种:父父父子子子、父父子子父子、父父子父子子、父子父父子子、父子父子父子。

任意输入父子的对数n(3<=n<=15),计算并输出有多少种出场策略。

【输入样例】 3 【输出样例】 5

思路

第一个必须安排父亲,那么还有n-1个父亲分布 2,3, ... ... 2×n,

排列组合 C(n-1,2n-1)= (2n-1)×(2n-2)× ....2n / (n-1)×(n-2)×... ...1

第1种写法 不用高级函数,解析排列组合公式

def solve(n):
    out = 1
    for i in range(1,n):
        out *= (2*n-i)/(n-i)
    return out
    
print(solve(n=3))
10.0

第2种写法 用高级函数

导入itertoolspermutations 条件判断过滤,保留符合每一个组合中第一个元素是 f

from itertools import permutations
def permut(n):
    f, s = n* ['f'], n * ['s']
    res = list(permutations(f+s,2*n))
    resfilter = [p for p in res if p[0]=='f']
    return len(set(resfilter)),set(resfilter)
    
n = 3
print(permut(n))

10

#所有组合

 {('f''s''f''s''s''f'), 
 ('f''s''f''s''f''s'), 
 ('f''f''f''s''s''s'), 
 ('f''f''s''f''s''s'), 
 ('f''f''s''s''f''s'),
 ('f''s''s''f''f''s'), 
 ('f''s''s''s''f''f'), 
 ('f''f''s''s''s''f'), 
 ('f''s''s''f''s''f'), 
 ('f''s''f''f''s''s')})

两种写法结果一致!

分类:

后端

标签:

后端

作者介绍

c
codeye
V1