# 🚦 兩數之和
[TWO SUM](http://120.101.182.21/d/hd112/p/63)
## 1. 題目介紹
在這個題目中,我們的任務是從一個數列中找出兩個數字,讓它們相加等於老師給定的目標數字。
題目情境非常有趣:
- 小晴和小宇在玩配對遊戲,目標是找到那組「神奇配對」使得兩數之和符合要求。
- 輸入數據包括數字個數 `n`、一組由空格分隔的正整數,以及目標和 `target`。
- 你必須找出滿足條件的兩個數字在數列中的索引(從 0 開始計算),並將它們輸出。
**注意事項:**
- 每組測資只會有唯一解,因此當你發現滿足條件的配對後,就可以停止檢查。
- 同一數字(同一位置)不可以重複使用,例如:即使兩個數字的值相同,其索引也必須不同。
---
## 2. 解題所需觀念
在解這題的過程中,你需要瞭解以下概念:
### 2.1 輸入與輸出
- **讀取數據個數 `n`**:了解如何讀取一個整數,代表接下來數據的數量。
- **讀取數字序列**:你可以用簡單迴圈讀入 `n` 個數字,儲存在變數或基本陣列中。(※ 本題盡量避免複雜的陣列或 STL,著重邏輯概念)
- **讀取目標數字 `target`**:接著再讀入一個整數作為目標。
### 2.2 使用迴圈
因為你需要檢查數列中的每一對數字,所以理解「**雙層迴圈**」非常重要:
- **外層迴圈**:用來選擇第一個數字。
- **內層迴圈**:用來檢查第二個數字,其範圍一般從外層選定數字的下一個位置開始,這樣避免重覆使用同一個數字。
### 2.3 條件判斷
在每次檢查中,需要判斷:
```cpp
if (第一個數字 + 第二個數字 == target) {
// 找到正確配對
}
```
這個條件判斷非常直觀,只有當兩個數字的和等於 `target` 時,才是你要的結果。
### 2.4 終止流程
由於題目保證只有一組答案,當你找到正確配對後,就可以立即終止程式或跳出迴圈,避免不必要的運算。
---
## 3. 解題流程與提示
以下是解題的邏輯步驟,大家可以依照這些提示來理解如何實作,但注意:**本講義不直接給出完整的答案程式碼**!
1. **讀取輸入**
- 首先,讀取整數 `n`,代表數字的個數。
- 接著,讀取 `n` 個整數形成數列。
- 最後,讀取目標數字 `target`。
2. **雙層迴圈處理**
- 使用第一個迴圈遍歷數列中每一個數字(從索引 0 至 n-2)。
- 在第二層迴圈中,從當前選定位置的下一個數字開始遍歷(索引從 i+1 至 n-1)。
- 對每一對(i, j)檢查:若 `數列[i] + 數列[j]` 等於 `target`,則表示找到了正確的配對。
3. **輸出結果**
- 將符合條件的兩個數字的**索引**輸出。索引從 0 開始,順序可以任意。
4. **終止程序**
- 由於題目只存在唯一解,當配對找到後,程式可立即結束後續的迴圈運算。
---
## 4. 小提示
- **注意變數命名**
使用有意義的變數名稱可以讓你的程式碼更易懂,例如:`n` 代表數字個數、`target` 代表目標和、`i` 與 `j` 用於迴圈索引、`nums` 代表讀入的數列。
- **使用迴圈結束語句**
當找到了配對,可以使用 `break` 或 `return` 來終止迴圈,避免不必要的計算。
- **測試與除錯**
在完成程式後,可利用提供的範例數據來測試你的解答是否正確。記得檢查輸入格式是否符合題目要求!
---
9 7
1 2 3 4 5 6 7
1 2 3 4 5 6 8
1 2 3 4 5 6 9
1 2 3 4 5 7 8
1 2 3 4 5 7 9
1 2 3 4 5 8 9
1 2 3 4 6 7 8
1 2 3 4 6 7 9
1 2 3 4 6 8 9
1 2 3 4 7 8 9
1 2 3 5 6 7 8
1 2 3 5 6 7 9
1 2 3 5 6 8 9
1 2 3 5 7 8 9
1 2 3 6 7 8 9
1 2 4 5 6 7 9
1 2 4 5 6 8 9
1 2 4 5 7 8 9
1 2 4 6 7 8 9
1 2 5 6 7 8 9
1 3 4 5 6 7 8
1 3 4 5 6 7 9
1 3 4 5 6 8 9
1 3 4 5 7 8 9
1 3 4 6 7 8 9
1 3 5 6 7 8 9
1 4 5 6 7 8 9
2 3 4 5 6 7 8
2 3 4 5 6 7 9
2 3 4 5 6 8 9
2 3 4 5 7 8 9
2 3 4 6 7 8 9
2 3 5 6 7 8 9
2 4 5 6 7 8 9
3 4 5 6 7 8 9