本文以實例形式講述了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程序算法設計的學習有一定的借鑒價值。
新聞熱點
疑難解答
圖片精選