整数的素数和分解

对于一个给定的整数,输出所有这种素数的和分解式,对于同构的分解只输出一次(比如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);

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值