基础实验2-2.5 整数分解为若干项之和 (20分) 详细解析dfs

将一个正整数N分解成几个正整数相加,可以有多种分解方法,例如7=6+1,7=5+2,7=5+1+1,…。编程求出正整数N的所有整数分解式子。

输入格式:

每个输入包含一个测试用例,即正整数N (0<<<N≤\le≤30)。

输出格式:

按递增顺序输出N的所有整数分解式子。递增顺序是指:对于两个分解序列N1=N_1=N​1​​={n1,n2,⋯n_1, n_2, \cdotsn​1​​,n​2​​,⋯}和N2=N_2=N​2​​={m1,m2,⋯m_1, m_2, \cdotsm​1​​,m​2​​,⋯},若存在iii使得n1=m1,⋯,ni=min_1=m_1, \cdots , n_i=m_in​1​​=m​1​​,⋯,n​i​​=m​i​​,但是ni+1<mi+1n_{i+1} < m_{i+1}n​i+1​​<m​i+1​​,则N1N_1N​1​​序列必定在N2N_2N​2​​序列之前输出。每个式子由小到大相加,式子间用分号隔开,且每输出4个式子后换行。

输入样例:

7

输出样例:

7=1+1+1+1+1+1+1;7=1+1+1+1+1+2;7=1+1+1+1+3;7=1+1+1+2+2

7=1+1+1+4;7=1+1+2+3;7=1+1+5;7=1+2+2+2

7=1+2+4;7=1+3+3;7=1+6;7=2+2+3

7=2+5;7=3+4;7=7

扫描二维码关注公众号,回复: 12170272 查看本文章
​#include<cstdio>
int sum = 0,n,pointer=0,count = 0;//sum是和,n是待求的数,pointer 指示搜索位置 ,count用来计数, 
int A[30];//存放搜索结果 	//记录当前是第一个分解式子,便于输出 
void dfs(int x)//一层dfs就是对一个位置的搜索,如第一层dfs就是对第一个位置的数字进行搜索 
{			//所以进入下一层dfs进行搜索时,搜索数从x开始而不是从1开始 
	if(sum == n) //当sum == n时到了一个死胡同,返回上一层的dfs 
	{
		count++;
		printf("%d=",n);
		for(int i=0; i<pointer-1; i++)
		{
			printf("%d+",A[i]);
		}
		if(count%4==0||A[pointer-1]==n)
		{
			printf("%d\n",A[pointer-1]);
		}
		else
		{
			printf("%d;",A[pointer-1]);
		}
		return;
	}
	else if(sum>n) return;//当sum > n时到了一个死胡同,返回上一层的dfs 
	else//没到死胡同,不撞南墙不回头 
	{
		for(int i=x; i<=n; i++)//i从x开始是因为后面位置的数一定要大于前面的数 
		{
			A[pointer] = i;//用i来探索
			pointer++; 
			sum += i;
			dfs(i);//下一个位置从i开始探索 
			//如果程序进行到这说明当前层探索值为i时,包括下一层以后的所有层数都已经探索完毕
			//准备进入下一层循环
			//进入下一次循环前,要把当前sum回溯,指针指回当前位置 
			sum -= i;
			pointer--;
		}
	}
}
int main()
{
	scanf("%d",&n);
	dfs(1);
	return 0;	
} ​

猜你喜欢

转载自blog.csdn.net/yiwaite/article/details/104119274