n(n≤100),後跟 n 個整數n=0 結束輸入用戶代碼存在邊界條件判斷重複導致最後一個數字輸出兩次:
// 原錯誤邏輯
if (q != n) { printf("%d ", c[q]); }
if (q == (n-1)) { printf("%d\n", c[q]); }
// 當 q == n-1 時,兩個條件均成立,輸出兩次
#include <stdio.h>
#include <stdlib.h>
// 絕對值比較函數(用於 qsort)
int cmp_abs_desc(const void *a, const void *b) {
int val1 = *(const int *)a;
int val2 = *(const int *)b;
int abs1 = abs(val1);
int abs2 = abs(val2);
return (abs2 - abs1); // 降序:大的在前
}
int main() {
int n;
int a[100];
while (scanf("%d", &n) != EOF) {
if (n == 0) break; // 遇到 0 結束
// 讀入 n 個整數
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
// 排序
qsort(a, n, sizeof(int), cmp_abs_desc);
// 輸出:空格分隔,行尾換行
for (int i = 0; i < n; i++) {
if (i == n - 1) {
printf("%d\n", a[i]); // 最後一個加換行
} else {
printf("%d ", a[i]); // 其他加空格
}
}
}
return 0;
}
qsort:替代手寫選擇排序,代碼簡潔、性能優、不易出錯cmp_abs_desc 專注絕對值降序邏輯,可復用i == n-1 區分最後一個元素while (scanf(...) != EOF && n != 0) 或循環內 if (n==0) breakfor 中聲明,避免殘留值干擾輸入:
3 3 -4 2
4 0 1 2 -3
0
程序輸出:
-4 3 2
-3 2 1 0
符合預期 Sample Output。
若要求不使用 qsort,正確的選擇排序實現:
// 選擇排序:每輪選最大絕對值放到已排序區末尾
for (int i = 0; i < n - 1; i++) {
int maxIdx = i;
for (int j = i + 1; j < n; j++) {
if (abs(a[j]) > abs(a[maxIdx])) {
maxIdx = j;
}
}
// 交換
if (maxIdx != i) {
int temp = a[i];
a[i] = a[maxIdx];
a[maxIdx] = temp;
}
}
abs() 需包含 <stdlib.h>(C 標準庫)abs(INT_MIN) 未定義行為(本題數據範圍安全)j < n vs j <= n)n=0 結束條件導致死循環