原始碼存在四大關鍵錯誤:
s[i] = s[i] - i - 1:莫名扣除學號值,導致總分錯誤。s[m[x-1]] = 0:將**學號索引**當分數索引歸零,破壞資料。m[x] = max:應存學號卻存了分數。for(i=0;i<=10;i++):輸出 11 筆而非 10 筆。n, k,建立結構體陣列 Student { id, total }。total。total 降序、id 升序排序 (可用 qsort)。id。#include <stdio.h>
#include <stdlib.h>
typedef struct { int id; int total; } Stu;
int cmp(const void* a, const void* b) {
Stu* p = (Stu*)a, *q = (Stu*)b;
if (q->total != p->total) return q->total - p->total;
return p->id - q->id;
}
int main() {
int n, k;
if (scanf("%d %d", &n, &k) != 2) return 0;
Stu* a = malloc(n * sizeof(Stu));
for (int i = 0; i < n; ++i) {
int id, sum = 0, score;
scanf("%d", &id);
for (int j = 0; j < k; ++j) { scanf("%d", &score); sum += score; }
a[i] = (Stu){id, sum};
}
qsort(a, n, sizeof(Stu), cmp);
for (int i = 0; i < 10 && i < n; ++i) {
if (i) printf(" ");
printf("%d", a[i].id);
}
puts("");
free(a);
return 0;
}
使用結構體封裝資料、標準庫排序、正確輸出格式,即可 AC。