已知三个点 $A(x_1, y_1), B(x_2, y_2), C(x_3, y_3)$ 在平面直角坐标系中的坐标。下列 C++ 表达式中,在精度误差范围 $1\text{e-}8$ 内能正确计算判断这三个点是三点共线的表达式是( )。
排列组合问题:先判断是否考虑顺序(排列P vs 组合C),再确定是否允许重复。乘法原理分步,加法原理分类。
区分排列(考虑顺序,$P(n,m)$)和组合(不考虑顺序,$C(n,m)$)。注意特殊元素优先处理、正难则反等计数技巧。
【考点】三点共线判定|浮点数精度误差|表达式等价变形
🎯 考纲定位:GESP 八级"算法基础"模块中"几何与图形"考点。命题人专门卡住考生"浮点比较"的致命弱点——很多考生背了叉积公式,却忘了浮点误差必须用 fabs() 加阈值,直接==0 会全盘皆错。
🧠 解题思维:三点共线等价于向量 AB×AC=0,即行列式 (x2-x1)(y3-y1)-(x3-x1)(y2-y1)=0。但坐标是 double,直接==0 会因浮点误差误判,必须用fabs(...) < 1e-8。选项 B 没 fabs 会错,A/D 用斜率会除零且误差更大,C 是唯一直接对几何与精度双重约束的写法。
🪤 陷阱拆解:A 的斜率相等在 y2=y1 时除零,且== 太严格;B 的叉积为 0 没考虑浮点误差,考试里常见;D 的斜率差绝对值小于 1e-8 同样有除零风险,且误差放大;C 是命题人特意设计的"安全写法"——用叉积避免除零,用 fabs+阈值处理精度。如果你只背"叉积=0 就共线",就会掉进 B 的坑。
🔄 反命题思维:把阈值改成 1e-6,C 可能变错,B 仍错;把表达式改成点积形式,答案完全不同。刷到同类题先问:命题人想考我"浮点比较"还是"几何判定"?这道题同时考了两项,C 才是唯一兼顾的写法。