试题 A: 握手问题 题解
题目描述
小蓝组织了一场算法交流会议,共有50人参加。按照惯例,每个人都要与除自己外的其他所有人握手一次。但有7个人彼此之间没有握手(这7人与其他43人正常握手)。求实际发生的握手总次数。
解题思路
常规握手问题模型
对于 n人 参与的会议,握手总次数可以用组合数公式计算:
C ( n , 2 ) = n ( n − 1 ) 2 C(n,2) = \frac{n(n-1)}{2} C(n,2)=2n(n−1)
因为每两人之间仅握手一次,共有 n ( n − 1 ) 2 \frac{n(n-1)}{2} 2n(n−1) 种组合。
本题特殊情况
存在 7人 彼此之间不握手,这意味着我们需要从总握手次数中扣除这7人之间的理论握手次数。即:
-
计算50人全握手的总次数
C ( 50 , 2 ) = 50 × 49 2 = 1225 C(50,2) = \frac{50 \times 49}{2} = 1225 C(50,2)=250×49=1225 -
计算7人之间的理论握手次数
C ( 7 , 2 ) = 7 × 6 2 = 21 C(7,2) = \frac{7 \times 6}{2} = 21 C(7,2)=27×6=21 -
实际握手次数
实际握手次数等于总次数扣除未发生的7人握手次数:
1225 − 21 = 1204 1225 - 21 = 1204 1225−21=1204
关键点分析
- 组合数应用:本题核心在于正确应用组合数公式建立数学模型。
- 特殊条件处理:正确处理7人组内部握手缺失的情况,避免重复计算或漏算。
- 数值计算:注意大数运算时的准确性,避免计算错误。
代码验证(C++)
#include <iostream>int main() {// 计算50人的总握手次数int total = 50 * 49 / 2;// 计算7人未发生的握手次数int exclude = 7 * 6 / 2;// 输出实际握手次数std::cout << total - exclude << std::endl;return 0;
}