「最後兩個就屬於『必須借助陣列』的情況啊。」
σ² = (Σ(xᵢ - μ)²) / n = (Σxᵢ²)/n - μ²
Σxᵢ 與 Σxᵢ² (除非用 Welford 線上算法,但題目未要求)。sum、sumSq 一次遍歷完成。需先算出平均 μ,再掃描一次比較每個 xᵢ > μ,**必須能再次訪問每個輸入值** → 需陣列或檔案/資料庫暫存。
#include
#include
int main() {
int n;
scanf("%d", &n);
double *a = malloc(n * sizeof(double));
double sum = 0, sumSq = 0;
for (int i = 0; i < n; i++) {
scanf("%lf", &a[i]);
sum += a[i];
sumSq += a[i] * a[i];
}
double mean = sum / n;
double variance = sumSq / n - mean * mean;
int above = 0;
for (int i = 0; i < n; i++)
if (a[i] > mean) above++;
printf("平均: %.2f 方差: %.2f 高於平均: %d\n", mean, variance, above);
free(a);
return 0;
}
double mean = 0, M2 = 0;
for (int i = 1; i <= n; i++) {
double x; scanf("%lf", &x);
double delta = x - mean;
mean += delta / i;
M2 += delta * (x - mean);
}
double variance = M2 / n; // 總體方差
// 但無法得到「高於平均人數」,因為沒存原始值
結論:題目要求「高於平均人數」→ **必須存儲原始值 (陣列/檔案)**,無捷徑。