整数的素数和分解问题

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;
}
posted @ 2012-07-16 16:21  Cavia  阅读(944)  评论(1编辑  收藏  举报