Codebar 程式酒吧

一座輕鬆學習程式的酒吧

0%

a225. 明明愛排列

題目連結

https://zerojudge.tw/ShowProblem?problemid=a225

建議類題

a104. 排序

解題思路

為數字排序的方法有很多種,而本題採用氣泡排序法,具體的作法是從第一個元素開始往下檢查,如果兩者的相對順序錯誤,就將兩者的位置對調,接著重新檢查,直到最後一個元素的位置也被確認正確無誤為止。

以本題來說,是要將輸入的數字按個位數由小到大排列,因此我們會從第二個數字開始檢查。如果它的個位數比前一個數字的個位數還大的話,代表檢查到目前為止,它在數列中的位置是正確的,我們就不會移動他的位置,繼續檢查下去;反之則需將它與前一個數字的位置對調,然後重新檢查;若是兩個數字的個位數相同,則依照數字的數值由大到小排列。

注意事項

根據題意,測資檔會包含多組測資,因此需使用「EOF寫法」。所謂 EOF 並不是一種真實存在的字元,而是「End Of File」的縮寫,意思是一份檔案的結尾,也可以說是輸入的停止。通常程式在執行時會先讀取輸入,再依據輸入進行相對的行動,但我們未必能知道輸入有幾筆、到什麼時候結束,這時候我們就可以讓電腦自動偵測。一旦它偵測到EOF條件為True,即代表輸入停止,就會結束讀取輸入,如此我們的程式就不用事先指定輸入的筆數,可以不斷讀取輸入並執行直到輸入結束。

程式碼:C語言

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#include <stdio.h>
int main() {
//宣告變數n,代表有幾個數字需要排序
int n;
//使用EOF寫法判斷程式執行的條件
while(scanf("%d", &n) != EOF) {
//宣告並讀取陣列arr,代要排序的數字
int arr[n];
for(int i = 0 ; i < n ; i++)
scanf("%d", &arr[i]);
//氣泡排序法:檢查相鄰兩項之間的關係
//有由小到大排序來說,若後項比前項還小,就將兩者交換
for(int i = 1 ; i < n ; i++)
for(int j = 0 ; j < i ; j++) {
//以個位數做排序標準,依個位數數值由小到大排列
if(arr[j]%10 > arr[i]%10) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
//若個位數相同,則將其由大到小排列
else if(arr[j]%10 == arr[i]%10 && arr[j] < arr[i]) {
int temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
}
//輸出排序後的數字
for(int i = 0 ; i < n ; i++)
printf("%d ", arr[i]);
printf("\n");
}
return 0;
}