## Missing Number [題目連結](https://cses.fi/problemset/task/1083) 給定一整數 $n$,接下來一行有 $n-1$ 個整數 $a_i$,這 $n-1$ 個整數在 $1\sim n$ 並且每個數字都不重複,請你找出缺少的那個數字並將其輸出,比如 $n = 3 ,a = \{1, 2\}$ 缺少 $3$ --- 題目標籤 : 迴圈(排序) 本題提示 : 題解一可以去思考 $1~n$ 之和與缺少一數(題目)之間有甚麼關聯,並用基礎數字運算解決 題解二可以去判斷排序後的數字與缺少之數有什麼關聯 解題思路一 : 這題說給 $1~n$ 但是少給一個,問少給的那個是哪一個,如果我們去看 $1~n$ 的和(如下圖)  像是積木一樣,所以只要統計積木的數量就是 $1~n$ 的和,如果今天積木少了幾塊(缺少某個數字) 就只要統計積木的數量跟 $1~n$ 的和差多少就知道少幾塊積木(少哪個數字) 也可以說如果用 $1~n$ 的和 $-$ 所有積木的塊數就知道少幾塊積木,也就知道答案 ```cpp= #include<bits/stdc++.h> using namespace std ; typedef long long LL ; int main() { ios::sync_with_stdio(0), cin.tie(0), cout.tie(0) ; LL n, now, tmp ; cin >> n ; tmp = (1+n)*n / 2 ; // 1~n 之和 for (int i=0;i<n-1;i++) { // 最後剩下的數(積木少幾塊)為題目要求 cin >> now ; tmp -= now ; } cout << tmp << '\n' ; return 0 ; } ``` 解題思路二 : 如果題目給定數字被排序過後呢,因為缺少一個數字,所以我們在陣列往後找的過程當中一定會找不到某數 也就是說,排序後找不到的那個數字就是答案 ```cpp= #include<bits/stdc++.h> using namespace std ; int num[200005] ; int main() { ios::sync_with_stdio(0), cin.tie(0), cout.tie(0) ; int n ; cin >> n ; for (int i=1;i<=n-1;i++) // 從 1 開始可以對應題目 1~n cin >> num[i] ; sort(num+1, num+n) ; // 排序 for (int i=1;i<=n;i++) { if (num[i] != i) { // 數字不對 => 缺少某數 => 答案 cout << i ; return 0 ; } } } ```
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up