题目叙述
任何一个大于1的自然数n,总可以拆分成若干个小于n的自然数之和。现在给你一个自然数n,要求你求出n的拆分成一些数字的和。每个拆分后的序列中的数字从小到大排序。然后你需要输出这些序列,其中字典序小的序列需要优先输出。
输入
第一行为一个整数n。
输出
若干数的加法式子。
样例输入 1
7
样例输出 1
1+1+1+1+1+1+1
1+1+1+1+1+2
1+1+1+1+3
1+1+1+2+2
1+1+1+4
1+1+2+3
1+1+5
1+2+2+2
1+2+4
1+3+3
1+6
2+2+3
2+5
3+4
提示
1 ≤ n ≤ 8 1 \le n \le 8 1≤n≤8
实现思路
填写代码中的三个 objective 即可。
-
objective 1:
递归前的处理,将 n(表示还剩下多少值没有用) 减去当前的 i 值即可。
-
objective 2:
把 i 加回去。
-
objective 3:
题目的意思是,输出的加法式子中必须含有
+
号,所以判断条件就是 如果
top == 1
就直接返回,不输出。
实现代码(C++)
#include<iostream>
int n, top; // n,保存当前n所剩没有加过的值,然后对当前所剩数进行搜索
int line[100];
void func(int last) {
if (n == 0) {
/*---------objective 3 begin-------*/
if (top == 1) {
return ;
}
/*---------objective 3 end---------*/
printf("%d", line[1]);
for (int i = 2; i <= top; i++) {
printf("+%d", line[i]);
}
printf("\n");
return ;
}
for (int i = last; i <= n; i++) {
top++;
line[top] = i;
/*---------objective 1 begin-------*/
n -= i;
/*---------objective 1 end---------*/
func(i);
/*---------objective 2 begin-------*/
n += i;
/*---------objective 2 end---------*/
top--;
}
return ;
}
int main() {
scanf("%d", &n);
top = 0;
func(1);
return 0;
}