試題 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;
}