跳到內容

08|陣列反轉與統計

還沒完成C 或 C++ 皆可CPU 時間上限 1 秒

相關主題: C 基礎速查、資料型態與範圍

C 或 C++ 皆可|CPU 時間上限 1 秒

讀入 n 個整數,先把它們倒過來輸出,再輸出這些數字的最小值、最大值和總和。

因為要倒過來輸出,必須先把所有數字存起來,這就是陣列的用途。

第一行是一個整數 n(1 ≤ n ≤ 1000)。

第二行有 n 個整數 x,相鄰兩個數字之間用一個空白隔開(-1,000,000 ≤ x ≤ 1,000,000)。

輸出兩行:

  • 第一行:把 n 個數字從最後一個到第一個依序輸出,相鄰兩個數字之間用一個空白隔開
  • 第二行:三個整數,依序是最小值、最大值、總和,用一個空白隔開

輸入:

5
3 -1 4 1 5

輸出:

5 1 4 -1 3
-1 5 12

輸入:

3
-8 -2 -5

輸出:

-5 -2 -8
-8 -2 -15
  • 陣列宣告:int a[1000];,合法的索引是 a[0] 到 a[999],a[1000] 已經超出範圍
  • 用迴圈讀入:for (int i = 0; i < n; i++)
  • 倒過來走:for (int i = n - 1; i >= 0; i--)
  • 找最小值、最大值時,初始值要用第一個元素,不要用 0
  • 總和的範圍:最多 1000 × 1,000,000 = 10^9,int 剛好放得下(上限約 21 億)
  • C:陣列大小要是常數,所以直接開題目的最大值 1000
  • C++:可以用 std::vector<int> a(n);,大小在執行時才決定
提示 1:全部都是負數時,最大值為什麼變成 0?

如果寫 int max = 0;,再一個一個比較,當所有數字都是負數時,沒有任何數字比 0 大,max 就一直是 0,但 0 根本不在輸入裡。同樣的,全部都是正數時,min = 0 也會出錯。

正確做法:min 和 max 的初始值都設成 a[0],再從第二個元素開始比較。

提示 2:數字之間的空白怎麼處理?

「相鄰兩個數字之間一個空白」代表 n 個數字之間只有 n - 1 個空白。常見的兩種寫法:

  • 先印第一個數字,之後每個數字都印成「空白 + 數字」
  • 每個數字前面都印空白,除了第一個(用 if 判斷是不是第一個)

(這個沙盒比對時會忽略行尾的空白,但練習寫出剛剛好的格式是好習慣,其他評測系統不一定會忽略。)

提示 3:陣列越界

倒過來輸出時,最後一個元素是 a[n - 1],不是 a[n]。如果迴圈從 i = n 開始,a[n] 根本不是輸入的資料,會印出奇怪的值;當 n 剛好是 1000 時,a[1000] 更是超出了陣列的範圍。

C/C++ 不會自動檢查索引,越界通常不會馬上當掉,而是默默讀到奇怪的值。超出範圍的存取,檢查時第一階段的 Sanitizer 會幫你抓出來。