此題在高中生程式解題系統的題號為:https://zerojudge.tw/ShowProblem?problemid=c295。
解法一,排序為主:
- 用二維整數陣列(也就是矩陣) d[20][20] 來存放資料。
- 針對矩陣的每一列(也就是每一群數字)作由小到大排序,而第 i 群數字的最大值會在 d[i][m-1] 位置上。
- 將每一群的最大數字做加總,儲存在整數變數 sum。
- 判斷每一群的所挑選出來的數字是否整除 sum。
- 使用 flag 來判斷這 n 群是否有一群以上的數字可整除 sum。
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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | #include <iostream> #include <algorithm> using namespace std; int main(void) { int d[20][20] = {0}; // 用二維整數陣列(也就是矩陣) d[20][20] 來存放資料。 int n, m; while(cin >> n >> m) // 讀取 n, m { // 讀取每一群的數字 for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) cin >> d[i][j]; // 針對矩陣的每一列(也就是每一群數字)作由小到大排序 for(int i = 0; i < n; i++) sort(d[i], d[i] + m); // 將每一群的最大數字做加總,儲存在整數變數 sum。 int sum = 0; for(int i = 0; i < n; i++) sum = sum + d[i][m-1]; // 第 i 群數字的最大值會在 d[i][m-1] 位置上。 cout << sum << endl; int flag = 0; // 判斷這 n 群是否有一群以上的數字可整除 sum。 // 判斷每一群的所挑選出來的數字是否整除 sum。 for(int i = 0; i < n; i++) { int v = d[i][m-1]; if(sum % v == 0) // 第 i 群所挑出來的數字是否有整除sum。 { if(flag == 0) // 可整除的第一個數字不用空白 cout << v; else cout << " " << v; // 可整除的第二個數字,前面需要加上空白 flag = 1; } } // 判斷這 n 群是否有一群以上的數字可整除 sum。 if(flag == 0) cout << -1 << endl; } return 0; } |
C 程式碼:
Python 程式碼:
解法二,不排序:
C++ 程式碼:
C 程式碼:
Python 程式碼:
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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 | #include <stdio.h> #include <stdlib.h> int cmp(const void *a, const void *b) { return ( *(int*)a - *(int*)b ); } int main(void) { int d[20][20] = {0}; // 用二維整數陣列(也就是矩陣) d[20][20] 來存放資料。 int n, m; while(scanf("%d%d", &n, &m) == 2) // 讀取 n, m { // 讀取每一群的數字 for(int i = 0; i < n; i++) for(int j = 0; j < m; j++) scanf("%d", &d[i][j]); // 針對矩陣的每一列(也就是每一群數字)作由小到大排序 for(int i = 0; i < n; i++) qsort(d[i], m, sizeof(int), cmp); // 將每一群的最大數字做加總,儲存在整數變數 sum。 int sum = 0; for(int i = 0; i < n; i++) sum = sum + d[i][m-1]; // 第 i 群數字的最大值會在 d[i][m-1] 位置上。 printf("%d\n", sum); int flag = 0; // 判斷這 n 群是否有一群以上的數字可整除 sum。 // 判斷每一群的所挑選出來的數字是否整除 sum。 for(int i = 0; i < n; i++) { int v = d[i][m-1]; if(sum % v == 0) // 第 i 群所挑出來的數字是否有整除sum。 { if(flag == 0) // 可整除的第一個數字不用空白 printf("%d", v); else printf(" %d", v); // 可整除的第二個數字,前面需要加上空白 flag = 1; } } // 判斷這 n 群是否有一群以上的數字可整除 sum。 if(flag == 0) printf("-1\n"); } return 0; } |
Python 程式碼:
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 | while True: try: n, m = map(int, input().split()) m = [] for i in range(n): v = list(map(int, input().split())) v.sort(reverse = True) # 由大到小做排序 m.append(v) # 算總和 sum = 0 for v in m: sum = sum + v[0] print(sum) flag = 0 for v in m: i = v[0] if sum % i == 0: # 此群最大值是否可以整除總和 if flag == 0: print(i, end='') else: print('', i, end='') flag = 1 if flag == 0: print(-1) except EOFError: break |
解法二,不排序:
- 用一個整數陣列 v[20] 來存放每群數字的最大值。
- 每一群資料在讀取時,邊判斷目前讀取到的數字是不是最大值。
- 讀完一群數字後,將此群的最大值存放到 v[i] 中,並加總到 sum 。
- 判斷每一群的所挑選出來的數字是否整除 sum。
- 使用 flag 來判斷這 n 群是否有一群以上的數字可整除 sum。
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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | #include <iostream> using namespace std; int main(void) { int v[20]; // 用一維陣列來儲存每一群的最大值 int n, m; while(cin >> n >> m) // 讀取 n, m { int sum = 0; // 讀取每一群的數字 for(int i = 0; i < n; i++) { int x = 0; // 此群的最大值 for(int j = 0; j < m; j++) { int t; cin >> t; if(x < t) x = t; } v[i] = x; // 儲存此群的最大值 sum += x; // 將每一群的最大數字做加總。 } cout << sum << endl; int flag = 0; // 判斷這 n 群是否有一群以上的數字可整除 sum。 // 判斷每一群的所挑選出來的數字是否整除 sum。 for(int i = 0; i < n; i++) { int x = v[i]; if(sum % x == 0) // 第 i 群所挑出來的數字是否有整除sum。 { if(flag == 0) // 可整除的第一個數字不用空白 cout << x; else cout << " " << x; // 可整除的第二個數字,前面需要加上空白 flag = 1; } } // 判斷這 n 群是否有一群以上的數字可整除 sum。 if(flag == 0) cout << -1 << endl; } return 0; } |
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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | #include <stdio.h> #include <stdlib.h> int main(void) { int v[20]; int n, m; while(scanf("%d%d", &n, &m) == 2) // 讀取 n, m { int sum = 0; // 讀取每一群的數字 for(int i = 0; i < n; i++) { int x = 0; // 此群的最大值 for(int j = 0; j < m; j++) { int t; scanf("%d", &t); if(x < t) x = t; } v[i] = x; // 儲存此群的最大值 sum += x; // 將每一群的最大數字做加總。 } printf("%d\n", sum); int flag = 0; // 判斷這 n 群是否有一群以上的數字可整除 sum。 // 判斷每一群的所挑選出來的數字是否整除 sum。 for(int i = 0; i < n; i++) { int x = v[i]; if(sum % x == 0) // 第 i 群所挑出來的數字是否有整除sum。 { if(flag == 0) // 可整除的第一個數字不用空白 printf("%d", x); else printf(" %d", x); // 可整除的第二個數字,前面需要加上空白 flag = 1; } } // 判斷這 n 群是否有一群以上的數字可整除 sum。 if(flag == 0) printf("-1\n"); } return 0; } |
Python 程式碼:
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 | while True: try: n, m = map(int, input().split()) sum = 0 m = [] for i in range(n): v = max(list(map(int, input().split()))) # 找這一群數字的最大值 sum = sum + v # 每一群的最大值做加總 m.append(v) # 將每一群的最大值存到 m print(sum) flag = 0 for i in m: if sum % i == 0: # 此群最大值是否可以整除總和 if flag == 0: print(i, end='') else: print('', i, end='') flag = 1 if flag == 0: print(-1) except EOFError: break |