--- title: 'UVa 100 題解 — C++' disqus: hackmd --- # UVa 100 題解 — C++ :::info :bulb: 此筆記為UVa 100的題目詳解,包含解題思路、C++範例程式碼。 ::: ## The 3n + 1 problem (ZeroJudge c039.) ### [題目](https://zerojudge.tw/ShowProblem?problemid=c039) :::success 考慮以下的演算法: 1. 輸入 n 2. 印出 n 3. 如果 n = 1 結束 4. 如果 n 是奇數 那麼 n=3*n+1 5. 否則 n=n/2 6. GOTO 2 例如輸入 22, 得到的數列: 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1 據推測此演算法對任何整數而言會終止 (當列印出 1 的時候)。雖然此演算法很簡單,但以上的推測是否真實卻無法知道。然而對所有的n ( 0 < n < 1,000,000 )來說,以上的推測已經被驗證是正確的。 給一個輸入 n ,透過以上的演算法我們可以得到一個數列(1作為結尾)。此數列的長度稱為n的cycle-length。上面提到的例子, 22 的 cycle length為 16. 問題來了:對任2個整數i,j我們想要知道介於i,j(包含i,j)之間的數所產生的數列中最大的 cycle length 是多少。 ::: ### 輸入 / 輸出說明 | **輸入說明** | **輸出說明** | |:-:|:-:| |  |  | ### 解題思路 :::warning 這題可以直接暴力解。 有個小地方可以注意一下,因為這題 i、j 並不一定 j > i,因此可以先輸出 i、j,若 i > j 再交換即可。 ::: ### 範例程式碼 ```C++= #include <bits/stdc++.h> using namespace std; int main () { ios::sync_with_stdio(false); cin.tie(0); int k; int i, j; while (cin >> i >> j) { int max = 0; cout << i << " " << j << " "; if (i > j) swap(i, j); for (k=i;k<=j;k++) { int n = k, l = 1; while (n != 1) { if (n % 2 != 0) n = 3 * n + 1; else n = n / 2; l++; } if (l > max) max = l; } cout << max << endl; } return 0; } ``` ### 運行結果 <font color="#00BB00">**AC**</font> (13ms, 332KB) ###### tags: `CPE 1星` :::danger 查看更多資訊請至:https://www.tseng-school.com/ :::
×
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