原题传送门:1.握手问题 - 蓝桥云课
问题描述
小蓝组织了一场算法交流会议,总共有 50人参加了本次会议。在会议上,大家进行了握手交流。按照惯例他们每个人都要与除自己以外的其他所有人进行一次握手 (且仅有一次)。但有 7 个人,这 7 人彼此之间没有进行握手 (但这 7人与除这 7 人以外的所有人进行了握手)。请问这些人之间一共进行了多少次握手?
注意 A 和 B 握手的同时也意味着 B 和 A 握手了,所以算作是一次握手。
答案提交
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
问题解析:
本题刻意提醒:“注意 A 和 B 握手的同时也意味着 B 和 A 握手了,所以算作是一次握手。”,我们在解题时应该特别注意关注这些提示的字眼,其可以在一定程度上减少我们的思维量。
其次,请注意,基本上所有的编程题都是数学问题,我们应当要有将具体问题抽象提炼成其对应的数学问题的能力。
遇到问题不要慌(其实我也挺慌的),先来提取题中的各种信息:
1,总共有50人参与;
2,有七位参与者例外,根据题目描述,他们与“除这 7 人以外的所有人进行了握手”(可能这七人之间有些不可告人的神秘过往?)
3,待求为这些人之间一共进行了多少次握手
到这里本题的基本逻辑就理清楚了,我们尝试将其抽象成数学问题:
其实只要你数学逻辑比较到位(bushi),读到这里你应该可以很明确的感受到,这就是数学里的排列组合问题
根据题中描述,50人本应该是两两之间相互握手,如果问题是这五十个人两两之间相互握手,求最后的握手次数,你应该可以很快反应过来一个数学概念:组合数!那本题是C呢还是A呢,如果你不确定,可以摇个骰子试试?
如果此时的你对于CA问题摇摆不定,或者并不太了解组合数的详细计算方法,请点击下方链接前往哔哩哔哩大学老老实实学习完本章的前置知识:(敲黑板!)【排列组合,20分钟从零基础到高考要求!|小姚老师】
同样的,对于这七位特立独行的人,我们可以敏锐的察觉到,对他们的处理将会成为本题的题眼!
即,针对这七个人的处理,我们可以延申出两种本题的解题方向:
1,正常计算的43人握手次数,加上,特立独行的7人与其他人之间的握手次数
2,正常计算的50人握手次数,减去,特立独行的7人之间本应该存在的握手次数
本题将采用第二种解法,至于第一种希望读者可以自行进行尝试,若存在阻碍,请在评论区或者后台留言
代码描述:
目录
原题传送门:1.握手问题 - 蓝桥云课
问题描述
在理清楚本题的基本逻辑之后,我们可以尝试着手写代码:
1,首先实现计算组合数的部分,如果你已经具备了解决本题的基本前置知识,那你应该可以确定,本题的关键是C!那么对于C的计算规则实现起来其实非常简单,代码如下:
# 计算组合数 C(n, 2),即从 50 人中任意选择 2 人进行握手
def comb(n):
"""计算组合数 C(n, 2)"""
return n * (n - 1) // 2
2,计算总的握手次数,我们使用上面提到的第二种计算方法实现:
# 计算总握手次数
def calculate_handshakes(total_people, excluded_people):
total_handshakes = comb(total_people) # 总人数之间的握手数
excluded_handshakes = comb(excluded_people) # 排除的7人之间的握手数
return total_handshakes - excluded_handshakes
3,设置传入的参数,调用函数,计算结果:
# 参数设置
total_people = 50
excluded_people = 7
# 计算结果
result = calculate_handshakes(total_people, excluded_people)
print(result)
对上述代码进行汇总,得到完整的代码如下:
# 计算组合数 C(n, 2),即从 50 人中任意选择 2 人进行握手
def comb(n):
"""计算组合数 C(n, 2)"""
return n * (n - 1) // 2
# 计算总握手次数
def calculate_handshakes(total_people, excluded_people):
total_handshakes = comb(total_people) # 总人数之间的握手数
excluded_handshakes = comb(excluded_people) # 排除的7人之间的握手数
return total_handshakes - excluded_handshakes
# 参数设置
total_people = 50
excluded_people = 7
# 计算结果
result = calculate_handshakes(total_people, excluded_people)
print(result)
结果提交:
执行上述代码,得到结果为:
写在最后,不管是在平时的练习,或者是平时的项目开发中,我们都应该有“变量作用如其名”,这样不仅方便代码的阅读者,同样也方便自身后期的排查与检验
本题就到这里了,由于服务器今年到期(余家贫,耕植不能自给,续不起了wuwuwuwuwu),所以自己的网站没了,又开始重操旧业来到csdn创作hhhhh,网站以及资源问题已经在着手解决了,往期内容至少还需年后才能继续观看,请多给玉儿一些时间,爱你么么哒