日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

整数n分解成素数乘积c语言,C程序实现整数的素数和分解问题

發布時間:2023/12/8 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 整数n分解成素数乘积c语言,C程序实现整数的素数和分解问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文以實例形式講述了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

#include

#include

#include

using namespace std;

vector result;

vector prvec;

void outputResult(int N, vector &prime, vector &result)

{

if(N < 0)

return;

if(N == 0) {

copy(result.begin(), result.end(), ostream_iterator(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 &prime, vector &result, int position)

{

if(N < 0)

return;

if(N == 0) {

copy(result.begin(), result.end(), ostream_iterator(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 &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程序算法設計的學習有一定的借鑒價值。

總結

以上是生活随笔為你收集整理的整数n分解成素数乘积c语言,C程序实现整数的素数和分解问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。