题目:
![](https://i-blog.csdnimg.cn/blog_migrate/bdd8baa10fcbdaf61d31001e26dee6fa.png)
解答:
#include "stdio.h"
void print(int len);
void dfs(int fore,int last,int index);
int N,arr[31];
int cnt=0;
//深度优先搜索
int main(){
scanf("%d",&N);
//一般情况下将保证第一个数不大于剩余的数,即{1,6}、{2,5}、{3,4}……
for(int i=1;i<=N/2;i++){
dfs(i,N-i,0);
}
//{7,0}单独处理
dfs(N,0,0);
return 0;
}
//fore是前一位的数,last是剩余的总数,index是数组当前索引
void dfs(int fore,int last,int index){
if(last<fore){
if(last==0){
arr[index]=fore;
print(index+1);
}
return;
}
//剩余数不小于过前一个数,可以向下寻找
arr[index]=fore;
for(int i=fore;i<=last/2;i++){
dfs(i,last-i,index+1);
}
dfs(last,0,index+1);
}
//输出表达式
void print(int len){
int i;
printf("%d=%d",N,arr[0]);
//N==arr[0]等于总和,说明此时已经是最后一个式子,直接退出
if(N==arr[0]){
return;
}
for(i=1;i<len;i++){
printf("+%d",arr[i]);
}
cnt++;
if(cnt==4){
cnt=0;
printf("\n");
}else{
printf(";");
}
}