任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。现在给你一个自然数n,要求你求出n的拆分成一些数字的和。每个拆分后的序列中的数字从小到大排序。然后你需要输出这些序列,其中字典序小的序列需要优先输出。
输入格式
待拆分的自然数n。
输出格式
输出:若干数的加法式子。
输入输出样例
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
题解
#include <bits/stdc++.h> using namespace std; int b,r,n,a[1001]={1},s; int print(int k){ printf("%d=",n); for(int i=1;i<=k-1;i++) { printf("%d",a[i]); printf("+"); } printf("%d ",a[k]); return true; } int search(int s,int h) { for(int i=a[h-1];i<=s;i++) { if(i<n&&i=k)//这里用n,不用s { a[h]=i; s=s-i; if(s==0) { print(h); } else{ search(s,h+1); s=s+i;//加上拆分的数,以便产生所有的可能拆分 //如果不加回来,无法回溯 } } } } int main() { scanf("%d",&n); search(n,1); return 0; }