自然数的拆分
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
自然数的拆分----回溯法实现
代码如下:
#include
using namespace std;
#define N 1000 //自定义数组长度,以免数组大小不够
int a[N]={0};
int get_last(void);
void output(void);
void split(int n);
void set_flag(void);
void change(void);
void split_output(void);
bool flag=true;
int main()
{
int n;
cin>>n;
if(n<2 || n>30)
{
cout<<"数据错误!仅接受大于1且小于31的自然数!"< } a[0]=n-1; a[1]=1; output(); if(n==2) return 0;//此时返回,是因为n=2时,只可能有一种情况,即1+1 while(flag) { int k=get_last(); split(k); } return 0; } /* 函数: split 功能: 无限分裂大于1的元素,到所有元素为1为止。 void split(int n) { for(int i=n;i>=0;i--) if(a[i]!=1) { if(i==0) change(); a[i] -= 1; a[i+1] += 1; split_output(); set_flag(); return; } } /* 函数: split_output 功能: 判断数组中元素是否满足从小到大的排列顺序,如果满足,说明没有重复,然后输出。否则,说明该种元素序列已经和前面的重复,故不再输出,直接return. */ void split_output(void) { for(int i=0;i if(a[i+1]>a[i]) return; output(); } /* 函数: change 功能: 当遍历到首元素,且首元素不为1时,将除首元素外其他元素相加,和存于a[1]中。然后将除a[0]与a[1]外所有元素置零。 */ void change(void) { for(int i=1;i if(a[i+1]!=0) { a[1] += a[i+1]; a[i+1]=0; } else return; /* 函数: set_flag 功能: 设置flag的值,以控制main函数里的while循环。 */ void set_flag(void) { for(int i=0;i if(a[i]>1) return; flag = false; } /* 函数: output 功能: 简单的输出数组里的各项元素,并且以‘+’连接在一起。*/ void output(void) { int i; for(i=0;i if(a[i+1]!=0) cout< else break;