国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C > 正文

C程序實現整數的素數和分解問題

2020-01-26 15:18:32
字體:
來源:轉載
供稿:網友

本文以實例形式講述了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循環(huán),就可以消除同構問題。

相信本文所述對大家C程序算法設計的學習有一定的借鑒價值。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

主站蜘蛛池模板: 新田县| 安溪县| 吉水县| 南郑县| 来宾市| 明溪县| 万山特区| 犍为县| 桑日县| 互助| 黄龙县| 法库县| 塔河县| 阿拉善右旗| 博客| 垣曲县| 贵州省| 丘北县| 盐城市| 呼图壁县| 天全县| 科技| 泰宁县| 弋阳县| 黄陵县| 霍城县| 广饶县| 涟水县| 张家港市| 嘉义县| 石阡县| 英德市| 沾益县| 南安市| 子洲县| 定州市| 莲花县| 夏津县| 茶陵县| 万山特区| 宕昌县|