首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言求方差與高於平均人數:題目明確要求「必須借助陣列」

     編輯:程式設計綜合問答

題目關鍵句

「最後兩個就屬於『必須借助陣列』的情況啊。」

數學推導與陣列必要性

方差公式

σ² = (Σ(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;
}

進階:Welford 線上算法 (真正不存陣列)


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; // 總體方差
// 但無法得到「高於平均人數」,因為沒存原始值

結論:題目要求「高於平均人數」→ **必須存儲原始值 (陣列/檔案)**,無捷徑。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved