您的位置:首页 > 其它

整数的素数和分解问题

2013-10-16 10:49 447 查看
问题描述

歌德巴赫猜想说任何一个不小于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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: