[C_CH10-中] The 3n + 1 problem
成績: 0 / 倒扣: 0.8
問題描述:考慮以下的演算法:
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 是多少。
輸入說明:輸入可能包含了好幾列測試資料,每一列有一對整數資料 i , j 。 0< i , j < 1,000,000
輸出說明:對每一對輸入 i , j 你應該要輸出 i, j 和介於 i, j 之間的數所產生的數列中最大的 cycle length 。範例:
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 是多少。
輸入說明:輸入可能包含了好幾列測試資料,每一列有一對整數資料 i , j 。 0< i , j < 1,000,000
輸出說明:對每一對輸入 i , j 你應該要輸出 i, j 和介於 i, j 之間的數所產生的數列中最大的 cycle length 。範例:
Sample Input: | Sample Output: |
1 10 10 1 100 200 201 210 900 1000 | 1 10 20 10 1 20 100 200 125 201 210 89 900 1000 174 |
解釋
長度count
範圍內最常長度max
帶測數字num
num是奇數: num = num*3+1
num是偶數: num = num/2
假設num的範圍是1~10
1 4 2 1
2 1 4 2 1
3 10 5 16 8 4 2 1
4 2 1
5 16 8 4 2 1
6 3 10 5 16 8 4 2 1
7 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
8 4 2 1
9 28 14 7 22 11 34 17 52 26 13 40 20 10 5 16 8 4 2 1
10 5 16 8 4 2 1
num 1 2 3 4 5 6 7 8 9 10
count 4 5 8 3 6 9 17 4 20 7
max = 20
輸出 x y max
- #include <iostream>
- using namespace std;
- int main() {
- // [C_CH10-中] The 3n + 1 problem
- int x, y, num, count = 1,max = 0;
- bool fir = true;
- while(cin >> x >> y)
- {
- if(x > y)
- {
- for(int i = y;i <= x;i++)
- {
- num = i;
- if(i == 1 && fir)
- {
- num = 3*num+1;
- count++;
- fir = false;
- }
- while(num != 1)
- {
- if(num % 2 != 0)
- {
- num = 3*num+1;
- count++;
- }
- else
- {
- num = num / 2;
- count++;
- }
- }
- if(max < count)
- {
- max = count;
- }
- count = 1;
- }
- cout << x << " " << y << " " << max << endl;
- max = 0;
- }
- else //y > x
- {
- for(int i = x;i <= y;i++)
- {
- num = i;
- if(i == 1 && fir)
- {
- num = 3*num+1;
- count++;
- fir = false;
- }
- while(num != 1)
- {
- if(num % 2 != 0)
- {
- num = 3*num+1;
- count++;
- }
- else
- {
- num = num / 2;
- count++;
- }
- }
- if(max < count)
- {
- max = count;
- }
- count = 1;
- }
- cout << x << " " << y << " " << max << endl;
- max = 0;
- }
- fir = true;
- }
- return 0;
- }
沒有留言:
張貼留言