輸入三個字符 (無空格),按 ASCII 碼從小到大輸出,字符間用空格分隔。多組測資 (EOF 結束)。
僅三個元素,直接用 **3 次比較交換** 即可完成排序 (類似冒泡/選擇排序的精簡版)。
#includeint main() { char a, b, c, t; // 讀取三字符 (跳過空白/換行) while (scanf(" %c %c %c", &a, &b, &c) == 3) { // 關鍵: 格式字串前加空白跳過 \n // 選擇排序網路 (Sorting Network for 3 elements) if (a > b) { t = a; a = b; b = t; } // 確保 a <= b if (a > c) { t = a; a = c; c = t; } // 確保 a 是最小 if (b > c) { t = b; b = c; c = t; } // 確保 b <= c printf("%c %c %c\n", a, b, c); } return 0; }
| 細節 | 說明 |
|---|---|
| 輸入格式 | 題目說「三個字符組成,之間無空格」,如 qwe。但 scanf("%c%c%c") 會讀入換行符。解法:scanf(" %c %c %c") — 格式字串前的空白自動跳過所有空白字元 (含 \n、空格、\t)。 |
| 排序網路 | 固定 3 次比較交換,無迴路,極致簡潔。對應比較器網路:(a,b) → (a,c) → (b,c)。 |
| ASCII 碼順序 | 數字 < 大寫字母 < 小寫字母。'0'=48, 'A'=65, 'a'=97。 |
| EOF 結束 | scanf(...) == 3 同時處理 EOF 與格式錯誤。 |
| 輸入 | 輸出 | ASCII 碼 |
|---|---|---|
| qwe | e q w | 101 113 119 |
| asd | a d s | 97 100 115 |
| zxc | c x z | 99 120 122 |
| CBA | A B C | 65 66 67 |
| 9a1 | 1 9 a | 49 57 97 |
#includeint cmp_char(const void *p1, const void *p2) { return *(const char*)p1 - *(const char*)p2; } int main() { char arr[100]; int n = 0; int ch; while ((ch = getchar()) != EOF) { if (ch != '\n' && ch != ' ' && ch != '\t') { arr[n++] = ch; } else if (n > 0) { qsort(arr, n, 1, cmp_char); for (int i = 0; i < n; i++) { putchar(arr[i]); if (i < n-1) putchar(' '); } putchar('\n'); n = 0; } } return 0; }
scanf("%c%c%c") 讀到上一行殘留的 \n → 輸出亂碼。**必須加空白跳過空白字元**。gets / fgets 讀整行再處理,較繁瑣但也可行。三元素排序是**排序網路**的最小非平凡案例。掌握 scanf(" %c") 跳過空白字元的技巧,對處理字符輸入類 OJ 題至關重要。固定比較次數的排序網路在嵌入式、GPU、硬體實現中極具價值 (無分支預測失誤、固定延遲)。