經典數學題:參考人數380-450人,總平均76分,男生平均75分,女生平均80.1分,求男女人數。C語言雙循環暴力求解時,直接用==比較浮點數導致無輸出。本文解析錯誤原因並給出正確代碼。
if (75*a + 80.1*b == (a+b)*76) // 錯誤:浮點數直接比較
printf("男生:%d, 女生:%d\n", a, b);
76.0000001 vs 76.0)== 要求完全相等,條件永不成立#include <stdio.h>
#include <math.h>
#define EPS 1e-3 // 0.001 足夠覆蓋誤差
int main() {
int a, b;
for (a = 0; a <= 450; a++)
for (b = 0; b <= 450; b++)
if ((380 <= a+b && a+b <= 450) &&
fabs(75*a + 80.1*b - (a+b)*76) < EPS)
printf("男生:%d, 女生:%d\n", a, b);
return 0;
}
原方程:75a + 80.1b = 76(a+b)
整理得:75a + 80.1b = 76a + 76b → 4.1b = a → 41b = 10a
即 a : b = 41 : 10,設 a = 41k, b = 10k,總人數 51k 在 380-450 之間。
k=8 時 51×8=408 符合,a=328, b=80。
純整數運算,零誤差,O(1) 秒解。
int main() {
for (int k = 1; ; k++) {
int total = 51 * k;
if (total > 450) break;
if (total >= 380) {
printf("男生:%d, 女生:%d\n", 41*k, 10*k);
}
}
return 0;
}
== 比較,必須用 fabs(x-y) < EPS