聯成電腦技術論壇

 找回密碼
 註冊
搜索
查看: 2403|回復: 1

[討論] 3n + 1問題

[複製鏈接]
發表於 2012-12-4 19:11:45 | 顯示全部樓層 |閱讀模式
考慮以下的演算法:

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 是多少。

Input
輸入可能包含了好幾列測試資料,每一列有一對整數資料 i,j 。  
0< i,j < 1,000,000

Output
對每一對輸入 i , j 你應該要輸出  i, j 和介於 i, j 之間的數所產生的數列中最大的 cycle length。

Sample Input
1 10
10 1
100 200
201 210
900 1000

Sample Output
1 10 20
10 1 20
100 200 125
201 210 89
900 1000 174


題目限制 :
1.所有變數均須加上final
2.不能使用迴圈
3.輸入/輸出僅能使用BufferedReader或System.*
 樓主| 發表於 2012-12-4 19:23:19 | 顯示全部樓層
題目本身不難
但加上限制之後 就不知道該怎麼寫了

以下是沒有限制時的程式碼
import static java.lang.System.*;
import java.util.Scanner;

public class Main {
    public static void main(String args[]) {
        Scanner s = new Scanner(in);

        while (s.hasNextLong()) {
            long i = s.nextLong(), j = s.nextLong(), res = 0;
            out.print(i + " " + j + " ");
            if (i > j) {
                long tmp = i;
                i = j;
                j = tmp;
            }
            for (long n = i; n <= j; n = ++i) {
                int len = 1;
                while (n != 1) {
                    n = ((n % 2) == 1) ? (3 * n + 1) : (n / 2);
                    len++;
                }
                res = (len > res) ? len : res;
            }
            out.println(res);
        }
        s.close();
    }
}


加上限制後的部分程式碼
public static long Cycle(long num, long len) {
        return (num == 1) ? len : Cycle(((num % 2) == 0) ? (num >> 1) : (3 * num + 1), ++len);
}
您需要登錄後才可以回帖 登錄 | 註冊

本版積分規則

小黑屋|Archiver|手機版|聯成電腦技術論壇

GMT+8, 2024-11-15 09:28

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回復 返回頂部 返回列表