自然数的拆分

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

cout<

}

/*

函数: get_last

功能: 获得数组中最后一个不为零的元素的索引值。

*/

int get_last(void)

{

int n;

for( n=0;n

if(a[n]==0)

break;

return n-1;

}

运行结果如下:

相关文档
最新文档