hce_nsysu
112年
計算機概論與程式設計
第 9 題
What is printed by the following C/C++ program?
int a[ ]={1, -2, 2, -1, 3, -1, 2};
int sum = 0, m = 0;
for (int i = 0; i < 7; i++){
sum += a[i];
if (sum < 0) sum = 0;
if (sum > m ) m = sum;
}
cout << m;
int a[ ]={1, -2, 2, -1, 3, -1, 2};
int sum = 0, m = 0;
for (int i = 0; i < 7; i++){
sum += a[i];
if (sum < 0) sum = 0;
if (sum > m ) m = sum;
}
cout << m;
- A 3
- B 4
- C 5
- D 6
- E 7
思路引導 VIP
想像你在進行一場積分比賽,過程中會有得分與扣分。規則是:如果你目前的總分不幸扣到變成負值,你可以選擇「當作沒發生過」將分數歸零,然後從下一關重新累計。在這種情況下,若你想找出整場比賽中「曾經達到過的最高分」,你會如何處理每一關得分後的總計,以及何時該決定放棄舊的分數從頭開始呢?
🤖
AI 詳解
AI 專屬家教
恭喜你準確地判斷出程式的輸出結果!這代表你對於程式邏輯的追蹤(Tracing)非常細心,能精確掌握變數在迴圈中的動態變化。這道題目實際上是電腦科學中經典算法 Kadane's Algorithm 的變體,用於尋找「最大子陣列總和」(Maximum Subarray Sum)。
累加與重置的邏輯驗證
在程式執行過程中,變數 sum 負責紀錄當前連續數字的累加值,而 m 則是紀錄「歷史最高點」。這題最關鍵的邏輯在於 if (sum < 0) sum = 0;。這意味著當先前的數值累加到出現負值時,與其帶著「負債」繼續往後加,不如果斷捨棄前面的序列,從零開始重新計算。我們觀察最後幾個步驟:當 $i=4$ 時,$a[4]=3$,此時 sum 從之前的 $1$ 變為 $4$;接著雖然遇到 $-1$,但隨後的 $+2$ 讓 sum 在最後一步衝到了 $5$。由於 $5$ 超過了之前的歷史紀錄,因此最後 m 輸出的結果就是 $5$。
▼ 還有更多解析內容