自然数拆分问题(递归)
AC代码注释写得很详细就不多解释了,如果有不明白的地方欢迎评论留言。
#include<stdio.h>
int n, top;
int line[100];
//我们利用n,保存当前n所剩没有加过的值,然后对当前所剩数进行搜索
void func(int last){//当前操作的数值为lastif(n == 0){if(top==1)return;//objective 3如何利用top判断前面一项把n全用完了的状态?而且,如果第一项n就用完了,根据题意我们应该怎么操作?printf("%d",line[1]);//思考:为什么不直接把line[1]放进for循环里呢?符号+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;//保存当前拆分的数in-=i;;//objective 1在进行下一次搜索前要做什么准备?提示:看顶端题解func(i);//递归n+=i;//objective 2之后呢?回溯:加上拆分的数,以便产生所有可能的拆分top--;}return;
}
int main(){scanf("%d",&n);top=0;//拆分的第top个数,提示:记得初始化变量!有时候就是因为不初始化变量本地ac交题wa。func(1);return 0;
}
发布评论