輸入 n (2≤n≤100) 及 n 個整數。求所有兩兩組合之和,去除重複值後,輸出剩餘數值總和。多組測資,n=0 結束。
i=0..n-2, j=i+1..n-1,計算 a[i]+a[j] 存入陣列 sum[]。sum[] 排序或雙層比對,移除重複值。#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 足夠容納所有數對。此解法邏輯清晰、符合 ACM 輸入輸出規範,可直接提交。