本文以執行個體形式講述了C程式實現整數的素數和分解問題,分享給大家供大家參考之用。具體方法如下:
要求:對於一個給定的整數,輸出所有這種素數的和分解式,對於同構的分解只輸出一次(比如5隻有一個分解2+3,而3+2是2+3的同構分解式)。
例如:
對於整數8,可以作為如下三種分解:
(1) 8 = 2 + 2 + 2 + 2
(2) 8 = 2 + 3 + 3
(3) 8 = 3 + 5
看到此題時,我的頭一反應是求解背包問題
思路如下:
f(N, array) = f(N - array[i], array), 儲存結果,array是儲存裡面元素值,即所有素數,參考前面一題,如果素數只能唯一使用一次,那麼就建立對應的一個bool數組即可,每使用一次就標記為true,然後遞迴函式之後需要重新置為false,對於本題不需要如此,但是需要將儲存結果的數組除去當前嘗試的素數。
代碼如下:
/* * Copyright (c) 2011 alexingcool. All Rights Reserved. */ #include <iostream>#include <iterator>#include <algorithm>#include <vector>using namespace std;vector<int> result;vector<int> prvec;void outputResult(int N, vector<int> &prime, vector<int> &result){ if(N < 0) return; if(N == 0) { copy(result.begin(), result.end(), ostream_iterator<int>(cout, " ")); cout << endl; return; } for(int i = 0; i < prime.size(); i++) { //為提高效率,可以在此做個判定條件,儘快返回 if(N - prime[i] < 0) break; result.push_back(prime[i]); outputResult(N - prime[i], prime, result); result.pop_back(); }}void outputResult2(int N, vector<int> &prime, vector<int> &result, int position){ if(N < 0) return; if(N == 0) { copy(result.begin(), result.end(), ostream_iterator<int>(cout, " ")); cout << endl; return; } for(int i = position; i < prime.size(); i++) { //為提高效率,可以在此做個判定條件,儘快返回 if(N - prime[i] < 0) break; result.push_back(prime[i]); outputResult2(N - prime[i], prime, result, i); result.pop_back(); }}bool isPrime(int number){ if(number <= 1) return false; if(number == 2) return true; for(int i = 2; i < number; i++) { if(number % i == 0) return false; } return true;}void generatePrime(int number, vector<int> &result){ for(int i = 2; i < number - 1; i++) { if(isPrime(i)) result.push_back(i); }}void main(){ int number = 8; generatePrime(number, prvec); outputResult(number, prvec, result); cout << "除去同構" << endl; outputResult2(number, prvec, result, 0);}
運行結果如下圖所示:
注意:對於同構問題,我是看輸出結果之後想到的,outputResult函數中,結果332,這樣不對的結果,一個明顯的特徵是出現3後,其後面的數不能再小於3,那麼只需要對儲存3當前的position即可,然後在當前position迴圈,就可以消除同構問題。
相信本文所述對大家C程式演算法設計的學習有一定的借鑒價值。