对于一个给定的整数,输出所有这种素数的和分解式,对于同构的分解只输出一次(比如5只有一个分解2+3,而3+2是2+3的同构分解式)。
example:
对于整数8,可以作为如下三种分解:
(1) 8 = 2 + 2 + 2 + 2
(2) 8 = 2 + 3 + 3
(3) 8 = 3 + 5
思路:对于每个数,先判定是不是素数,如果是就可以分别放进一个数组中,最后等待输出,然后递归求这个数减去素数后的素数和分解式。
#include<iostream.h>
#include<math.h>
bool pnumber(int n)//判断是不是素数
{
bool tmp=true;
for(int i=2;i<=sqrt(n);i++)
if(n%i==0)
tmp=false;
return tmp;
}
void printf(int a[],int m)//输出最后的结果
{
cout<<a[1];
for(int i=2;i<=m;i++)
cout<<"+"<<a[i];
cout<<endl;
}
void resolve(int n,int a[],int m)//递归的求解各个素数
{
if(n==0) //当递归到n为了,就是结束的时候,输出a中的m个元素
printf(a,m);
else
{
for(int i=2;i<=n;i++)//对小于n的各个数字测试,判断是不是素数
{
int tp=m; //对于每种可能保存开始放入数组内的位置,因为在这个for循环中,元素放入数组的位置一定是m这个值
if(pnumber(i))
{
a[++tp]=i;
resolve(n-i,a,tp);//递归的求解n-i的各个素数,素数放入数组下一个位置
}
}
}
}
void rresolve(int n,int a[],int m)//递归的求解各个素数
{
if(n==0) //当递归到n为了,就是结束的时候,输出a中的m个元素
printf(a,m);
else
{
for(int i=2;i<=n;i++)//对小于n的各个数字测试,判断是不是素数
{
int tp=m; //对于每种可能保存开始放入数组内的位置,因为在这个for循环中,元素放入数组的位置一定是m这个值
if(pnumber(i)&&i>=a[m])// 各个素数都是从小到大的顺序,因此本素数一定大于前面的素数
{
a[++tp]=i;
rresolve(n-i,a,tp);//递归的求解n-i的各个素数,素数放入数组下一个位置
}
}
}
}
void main()
{
int num=12;
int a[12]={0},m=0;//a[]用于存放所有满足情况的素数,m表示有几个这样的素数
resolve(num,a,m);//m在这个函数中十分重要,表示数组内有元素个数
cout<<"去除同构:"<<endl;
rresolve(num,a,m);
}
7836

被折叠的 条评论
为什么被折叠?



