问题描述
歌德巴赫猜想说任何一个不小于6的偶数都可以分解为两个奇素数之和。
对此问题扩展,如果一个整数能够表示成两个或多个素数之和,则得到一个素数和分解式。对于一个给定的整数,输出所有这种素数和分解式。
注意,对于同构的分解只输出一次(比如5只有一个分解2 + 3,而3 + 2是2 + 3的同构
分解式)。
例如,对于整数8,可以作为如下三种分解:
(1) 8 = 2 + 2 + 2 + 2
(2) 8 = 2 + 3 + 3
(3) 8 = 3 + 5
解题思路
1、首先要求出所有<=n的素数;
2、然后递归输出所有可能的组合;
代码实现
#include<iostream>
#include <vector>
using namespace std;
//输出所有<=n的素数
void CalPrime(std::vector<int> &v, int n)
{
v.clear();
if (n < 2)
{
return;
}
v.push_back(2);
for (int i = 3; i <= n; i++)
{
int j = 2;
for (j = 2; j*j <= n; j++)
{
if (i % 2 == 0)
{
break;
}
}
if (j*j > n)
{
v.push_back(i);
}
}
}
//输出容器中的元素
void _print(const std::vector<int> &v)
{
for (int i = 0; i < v.size(); i++)
{
cout<<v.at(i)<<" ";
}
cout<<endl;
}
//输出所有的素数组合
void PrintAllDatas(const std::vector<int> &prime, std::vector<int> &v, int n, int start)
{
if (n < 0)
{
return ;
}
else if (n == 0)
{
_print(v);
}
else
{
int sz = prime.size();
for (int i = start; i < sz; i++)
{
v.push_back(prime[i]);
PrintAllDatas(prime, v, n - prime[i], i);
v.pop_back();
}
}
}
int main()
{
int n;
while(cin>>n){
std::vector<int> prime;
CalPrime(prime, n);
std::vector<int> v;
PrintAllDatas(prime, v, n, 0);
cout<<"----------------------------------"<<endl;
}
system("pause");
return 0;
}