将一个正整数N分解成几个正整数相加,可以有多种分解方法,例如7=6+1,7=5+2,7=5+1+1,…。编程求出正整数N的所有整数分解式子。
输入格式:
每个输入包含一个测试用例,即正整数N (0<N≤30)。
输出格式:
按递增顺序输出N的所有整数分解式子。递增顺序是指:对于两个分解序列N1={n1,n2,⋯}和N2={m1,m2,⋯},若存在i使得n1=m1,⋯,ni=mi,但是ni+1<mi+1,则N1序列必定在N2序列之前输出。每个式子由小到大相加,式子间用分号隔开,且每输出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
看到大佬的代码 做了些小修改
附上代码以供不时之需
代码一:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int n,row,j;/*row记录是否改换行,j记录已经分解了几个数了*/
int ans[35],sum=0;/*ans存储分解的数*/
void dfs(int x)
{
int i;
if(x==0&&sum==n)
{/*输出答案,注意题目要求格式*/
row++;
printf("%d=",n);
for(i=0;i<j;i++)
if(i==0)printf("%d",ans[i]);
else printf("+%d",ans[i]);
if(row%4==0)
{
printf("\n");
row=0;
}
else if(ans[j-1]!=n)printf(";");
return;
}
for(i=1;i<=x;i++)
{
if(ans[j-1]>i)continue;/*如果不递增了,就跳过这个枝*/
ans[j++]=i;/*记录答案*/
sum+=i;
dfs(x-i);/*为剩下的数进行搜索*/
sum-=i;/*还原现场*/
j--;
}
}
int main()
{
scanf("%d",&n);
dfs(n);
return 0;
}
源网址:整数分解为若干项之和(题解)_格子格子gz的博客-CSDN博客
代码二:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int a[30]; /*数组a保存递归过程中的分解项*/
int n; /*待分解数n*/
int Count = 0; /*记录输出个数*/
/*
index是将本轮所得分解项存入数组的a[index]位置中;
start是分解的起点值,即该轮分解项应不小于start;
num是剩余待分解的数值。
*/
void fenjie(int index, int start, int num)
{
int i;
if (num!=0)
{
for (i=start;i<=num;i++) /*分解起点是start*/
{
a[index]=i; /*本轮分解项i存入a[index]中*/
start=i; /*设置下轮分解项,保证不小于前面的分解项*/
fenjie(index+1,start,num-i); /*递归*/
}
}
else
{/*递归基,打印输出*/
printf("%d=",n);
printf("%d",a[0]);
for (i=1;i<index;i++)
{
printf("+%d",a[i]);
}
Count++;
if (Count!=4&&a[index-1]!=n)printf(";"); /*行末不输出分号*/
if (Count==4){printf("\n");Count=0;} /*每输出4个换行*/
}
}
int main()
{
scanf("%d",&n);
fenjie(0,1,n);
return 0;
}