---
# System prepended metadata

title: CSES-Weird Algorithm

---

## Weird Algorithm
[題目連結](https://cses.fi/problemset/task/1068)
給定一整數 $n$，如果 $n$ 是偶數就 $\div 2$ ，如果 $n$ 是奇數就 $\times 3-1$ 直到 $n = 1$
請輸出 $n$ 到 $1$ 的過程比如 $n = 3 \rightarrow 3\ 10\ 5\ 16\ 8\ 4\ 2\ 1$

---

題目標籤 : 迴圈、判斷
本題提示 : 
```cpp=
while (???) { // 直到 ??? 之前都要持續運算
    if (n % 2 == ???) { // n 是奇數或偶數?
        ???
    }
    else { // n 是另一種情況
        ???
    }
}
```

解題思路 :
題目說從 $n$ 到 $1$ 的過程作運算，可以理解成還沒到 $1$ 之前都要重複運算
重複直到變成 $1$，這樣其實就跟 while 迴圈一樣，所以運算過程包在 while 裡面
題目還有說偶數與奇數的不同處理方法，這裡用 if 去判斷偶數或是奇數即可

```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 ;
    cin >> n ;
    cout << n << ' ' ;
    while (n != 1) { // 沒變成 1 之前都重複運算 
        if (n % 2 == 1) // 奇數
            n = n*3 + 1 ;
        else            // 偶數
            n /= 2 ;
        cout << n << ' ' ;
    }

    return 0 ;
}
```

### 心得(可跳過)
這其實是一個數學的猜想，至今還沒被證明，但是已經證明比題目範圍還大很多的情況了
就是在證明範圍內的所有數字最後都會變成 $1$，最後都會進入 $4\ 2\ 1$ 的輪迴