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

ACM 題目完整 C 語言解法:數對和去重求和

     編輯:程式設計綜合問答

題目重述

輸入 n (2≤n≤100) 及 n 個整數。求所有兩兩組合之和,去除重複值後,輸出剩餘數值總和。多組測資,n=0 結束。

演算法邏輯

  1. 生成數對和:雙層迴圈 i=0..n-2, j=i+1..n-1,計算 a[i]+a[j] 存入陣列 sum[]。
  2. 去重:對 sum[] 排序或雙層比對,移除重複值。
  3. 求和:累加去重後的陣列元素。

完整 AC 程式碼

#include <stdio.h>
#define MAX_N 100
#define MAX_COMB (MAX_N*(MAX_N-1)/2)

int pair_add(int a[], int n, int b[]);
int repeat_del(int a[], int n);
int final_sum(int a[], int n);

int main() {
    int n;
    while (1) {
        printf("Please input the number scale n (2<=n<=100, 0 to quit): ");
        if (scanf("%d", &n) != 1 || n == 0) break;
        if (n < 2 || n > MAX_N) continue;

        int a[MAX_N], sum_arr[MAX_COMB];
        for (int i = 0; i < n; i++) scanf("%d", &a[i]);

        int pair_cnt = pair_add(a, n, sum_arr);
        int uniq_cnt = repeat_del(sum_arr, pair_cnt);
        int total = final_sum(sum_arr, uniq_cnt);

        printf("SUM is %d\n\n", total);
    }
    return 0;
}

// 生成所有兩兩之和
int pair_add(int a[], int n, int b[]) {
    int k = 0;
    for (int i = 0; i < n-1; i++)
        for (int j = i+1; j < n; j++)
            b[k++] = a[i] + a[j];
    return k;
}

// 簡單 O(m^2) 去重(m≤4950,足夠快)
int repeat_del(int a[], int n) {
    for (int i = 0; i < n-1; i++) {
        for (int j = i+1; j < n; j++) {
            if (a[i] == a[j]) {
                for (int k = j; k < n-1; k++) a[k] = a[k+1];
                n--; j--;
            }
        }
    }
    return n;
}

// 累加
int final_sum(int a[], int n) {
    int s = 0;
    for (int i = 0; i < n; i++) s += a[i];
    return s;
}

優化提示

  • 去重可先 qsort 再單次掃描 O(m log m),更高效。
  • 注意陣列大小 MAX_COMB = 100*99/2 = 4950 足夠容納所有數對。
  • 輸入迴圈務必處理 EOF 與非法輸入,避免無限迴圈。

此解法邏輯清晰、符合 ACM 輸入輸出規範,可直接提交。

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