2
7
2=1+1 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
#include<iostream> #include<cstdio> using namespace std; int n; int a[1000]; void dfs(int x,int u)//x表示第几个位置,u表示剩下的数(就是n减去前一个位置的数剩下的数) { if(u==0&&x>2)//如果剩下的数为0了而且最起码有2个位置 { printf("%d=",n);//输出格式 for(int i=1;i<x-1;i++) { printf("%d+",a[i]); } printf("%d\n",a[x-1]);//单独输出最后一个数,因为最后一个数的后面没有加号 return ; } for(int i=1;i<=u;i++) { if(i>=a[x-1])//剩下的数要大于等于前面位置上的那个数,这是为了顺序 { a[x]=i;//数组中x的位置为i u=u-i;//剩余的数减去i dfs(x+1,u); //回溯 a[x]=0; u=u+i; } } } int main() { while(cin>>n)//输入n { a[0]=1;//算式中第一个数是1 dfs(1,n); printf("\n"); } return 0; }
原文:https://www.cnblogs.com/chen-kaige/p/14590424.html