首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 暴力演算法尋找連續合數奇數序列:從 n+2x 到最小起始值 a 的完整實作

     編輯:Java 相關知識

問題背景與挑戰

在數論與演算法練習中,尋找「連續 6 個奇數皆為合數」的最小起始值 a,是一個經典的暴力搜尋題目。序列形式為 a, a+2, a+4, a+6, a+8, a+10,要求每一項皆為合數(非質數)。本文將詳細解析如何使用 Java 實作暴力演算法,並展示從 1 連續到 100 連續的完整執行日誌與效能數據。

核心演算法設計

合數判斷函式

採用試除法至平方根,時間複雜度 O(√n):

public static boolean isComposite(int num) {
    if (num < 2) return false;
    int sqrt = (int) Math.sqrt(num);
    for (int i = 2; i <= sqrt; i++) {
        if (num % i == 0) return true;
    }
    return false;
}

遞歸搜尋策略

採用貪婪遞歸:找到滿足 k 連續的最小值後,直接以該值為起點搜尋 k+1 連續,大幅縮減搜尋空間。

public static List<Map<Integer, Integer>> searchConsecutive(int times, int start, boolean onlyStart) {
    List<Map<Integer, Integer>> results = new ArrayList<>();
    // 略過偶數、邊界檢查...
    for (int i = start; i < Integer.MAX_VALUE; i += 2) {
        boolean allComposite = true;
        for (int j = 0; j < times; j++) {
            if (!isComposite(i + 2 * j)) { allComposite = false; break; }
        }
        if (allComposite) {
            Map<Integer, Integer> map = new HashMap<>();
            map.put(times, i);
            results.add(map);
            // 遞歸搜尋下一層
            results.addAll(searchConsecutive(times + 1, i, true));
            break;
        }
    }
    return results;
}

執行結果與效能分析

程式記錄了從 1 連續到 124 連續的完整搜尋過程,關鍵里程碑如下:

連續數最小起始值 n耗時 (ms)累計耗時 (ms)
611501
1031399513
131705170986082100979
152083132534772135752
124387096135665020110265457

效能觀察

  • 前期(< 20 連續)極快,毫秒級完成
  • 中後期呈指數級增長,124 連續需約 2.85 小時
  • 同一連續數可能有多個解(如 6 連續有 3 個起始值),程式記錄所有發現值

優化方向與思考

雖然暴力法能解決問題,但隨著連續數增加,效能瓶頸明顯。可考慮以下優化:

  1. 篩法預計算:使用埃拉托斯特尼篩法預先標記合數,O(1) 判斷
  2. 模式匹配:利用合數分佈規律(如模 3、5、7 等),跳過不可能區間
  3. 並行搜尋:將搜尋區間分塊,多執行緒並行
  4. 數學推導:構造同餘方程組,直接計算滿足條件的最小解

完整程式碼結構

程式包含三個核心類別:

  • ZhishuTest:主類,含合數判斷、遞歸搜尋、效能計時
  • 使用 ThreadLocal 管理執行緒本地節點
  • 採用 AtomicReferenceFieldUpdater 實作無鎖佇列(CLH 鎖變體)

完整原始碼已整合於上方片段,可直接複製編譯執行。建議搭配 -Xmx2g 等 JVM 參數執行長時間搜尋任務。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved