哥德巴赫猜想指出「任意 ≥6 的偶數可寫成兩奇素數之和」。本文將其推廣:輸出一個整數所有「兩個或以上素數之和」的分解式,同構分解(如 2+3 與 3+2)僅保留一種。透過篩法預計算素數表,再以遞歸回溯枚舉所有組合,並附上 C++ 完整實作與大規模測試數據。
CalcPrimes(n) 產出所有 < n 的素數,存入 vector<int>。PrintCombinations(剩餘值, 素數表, 起始索引, 目前路徑)
起始索引 遍歷素數表,確保非遞減序列,自動消除同構重複。void CalcPrimes(int num, vector<int>& primes) {
primes.clear(); if (num <= 2) return;
primes.push_back(2);
for (int i=3; i<num; i+=2) {
int r = sqrt(i);
for (int j=2; j<=r; ++j) if (i%j==0) goto next;
primes.push_back(i);
next: ;
}
}
int PrintCombinations(int num, const vector<int>& primes, int from, vector<int>& path) {
if (num == 0) { /* 輸出 path */ return 1; }
int cnt = 0;
for (int i=from; i<primes.size(); ++i) {
if (num < primes[i]) break;
path.push_back(primes[i]);
cnt += PrintCombinations(num - primes[i], primes, i, path);
path.pop_back();
}
return cnt;
}
8 = 2+2+2+2 | 2+3+3 | 3+5 (3 種)
10 = 2×5 | 2+2+3+3 | 2+3+5 | 3+7 | 5+5 (5 種)
20 = ... (26 種)
| N | 分解總數 | 耗時 (Real) |
|---|---|---|
| 100 | 40,899 | 0.11 秒 |
| 200 | 9,845,164 | 38.3 秒 |
| 300 | 627,307,270 | 50 分 37 秒 |
dp[i][j] 表示用前 j 個素數湊出 i 的方案數,將複雜度降至 O(N × π(N))。「素數分解問題既是經典數論練習,也是遞歸與 DP 思維轉換的絕佳教材。」