一个整数可以分解成若干素数的和
输入一个整数,试求出所有可能的分解
#include<iostream>
#include<stack>
#include<vector>
using namespace std;
void function(int n,int begin,vector<int>& prime)
{
static vector<int> result;//静态局部向量,不要用引用参数
if(n<0) return;//这一步如果少了,会陷入死循环
if(n==0)
{
vector<int>::iterator it = result.begin();
while(it!=result.end())
{
cout<<*it<<" ";
it++;
}
cout<<endl;
return;
}
int num = prime.size();
for(int i=begin;i<num;i++)
{
result.push_back(prime[i]);
function(n-prime[i],i,prime);//这里是i而不是i+1,如果是I+1就得不到含有相同素数的解了,同时防止出现3,2这种递减的解
result.pop_back();
}
}
bool isPrime(int n)//判断一个数是不是素数
{
int i = 2;
for(;i*i<=n;i++)
{
if(n%i == 0)
break;
}
if(i*i<=n)
return false;
return true;
}
void generate(int n,vector<int>& prime)//生成前n个素数
{
prime.push_back(2);
for(int i=3;i<n;i++)
{
if(isPrime(i))
{
//cout<<i<<endl;
prime.push_back(i);
}
}
}
void display(vector<int> &prime)//输入可能的解
{
vector<int>::iterator it = prime.begin();
while(it!=prime.end())
{
cout<<*it<<" ";
it++;
}
cout<<endl;
}
int main()
{
int n;
vector<int> prime;
//vector<int> result;
cin>>n;
generate(n,prime);
display(prime);
function(n,0,prime);
getchar();
getchar();
return 0;
}