您的位置:首页 > 其它

整数的素数和分解问题

2012-07-16 16:21 225 查看
Q:如果一个整数能够表示成两个或多个素数之和,则得到一个素数和分解式。对于一个给定的整数,输出所有这种素数和分解式。注意,对于同构的分解只输出一次(比如5只有一个分解2 + 3,而3 + 2是2 + 3的同构分解式)。

例如,对于整数8,可以作为如下三种分解:
(1) 8 = 2 + 2 + 2 + 2
(2) 8 = 2 + 3 + 3
(3) 8 = 3 + 5

A:典型的回溯问题,不过要考虑两点,一是怎么求得候选数组,也就是小于该整数的所有素数;二是怎么保证不进行同构的回溯。

#include <iostream>
#include <vector>
#include <cmath>
using namespace std;

void GetPrimes(int n,vector<int>& Prime)
{
Prime.push_back(2);
for(int i=3;i<=n;++i)
{
int k;
for(k=2;k*k<=i;++k)
if(i%k==0)
break;
if(k*k>i)
Prime.push_back(i);
}
}

void Func(int n,int begin,vector<int>& Prime)
{
static vector<int> V;
if(n<0)
return;
else if(n==0)
{
for(vector<int>::iterator it=V.begin();it!=V.end();++it)
cout <<*it<<" ";
cout <<endl;
}
else
{
int num=Prime.size();
//保证不同构
for(int i=begin;i<num;++i)
{
V.push_back(Prime[i]);
Func(n-Prime[i],i,Prime);
V.pop_back();
}
}
}

int main()
{
int n=8;
vector<int> Prime;
GetPrimes(n,Prime);
Func(n,0,Prime);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: