將一個正整數N分解成幾個正整數相加,可以有多種分解方法,例如7=6+1,7=5+2,7=5+1+1,…。編程求出正整數N的所有整數分解式子。
每個輸入包含一個測試用例,即正整數N (0<<N/le≤30)。
按遞增順序輸出N的所有整數分解式子。遞增順序是指:對于兩個分解序列N_1=N?1??={n_1, n_2, /cdotsn?1??,n?2??,?}和N_2=N?2??={m_1, m_2, /cdotsm?1??,m?2??,?},若存在ii使得n_1=m_1, /cdots , n_i=m_in?1??=m?1??,?,n?i??=m?i??,但是n_{i+1} < m_{i+1}n?i+1??<m?i+1??,則N_1N?1??序列必定在N_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+27=1+1+1+4;7=1+1+2+3;7=1+1+5;7=1+2+2+27=1+2+4;7=1+3+3;7=1+6;7=2+2+37=2+5;7=3+4;7=7#include<iostream>#include<cstdio>using namespace std;int cnt;int sum;int n,k;int a[35];int top;void dfs(int num){	if(sum==n)	{		PRintf("%d=",n);		for(int i=0;i<top-1;i++)		printf("%d+",a[i]);		k++;		if(k==4||top==1)		{			k=0;			printf("%d/n",a[top-1]);		}		else		printf("%d;",a[top-1]);		return;	}	if(sum>n)	return;	for(int i=num;i<=n;i++)	{		a[top++]=i;		sum+=i;		dfs(i);		a[--top];		sum-=i;	 } }int main(){	while(cin>>n)	{		k=0;		top=0;		sum=0;		dfs(1);	}	return 0;}
新聞熱點
疑難解答