整数拆分成一个非减整数序列的和,求出所有的序列

在网上经常看到这样的类似题:5=1+1+1+1+1,5=1+1+1+2,5=1+1+3。。。一个整数可以写成一些整数的和的形式,列出所有的整数序列,序列从小到大排列。

       本题可以采用迭代的方法来解决。假设要考察的整数为N,某个满足要求的序列为A1,A2,,,Ai.(i<=N, Aj>=1,i<=j<=i),有N=A1+A2+...Ai。

        在迭代中,假设当前的序列为A1,A2,,,,Ak(Ak<=N,1<=k<=i),此序列中最大的整数为curMax=Ak,当前序列的和为curSum=A1+A2+...Ak.

如果curSum==N,则当前序列为满足要求的序列,输出A1,A2,,,Ak.否则,从curMax开始每次加1,向或不向序列中增加curMax整数,直到curSum<=N.进行迭代。具体代码如下:

 

#include <iostream>

using namespace std;

 

const int N=10;

int index; //数组元素的指针,表示当前序列中最后一个元素的位置

 

/**

a为存储结果的数组,curSum为当前结果中的和,curMax为当前结果中最大的整数 

*/

void f(int* a,int curSum,int curMax)

{

     if(curSum == N)

     {

         cout<<N<<"="<<a[1];

         for(int j=2;j<=index;j++)

         {

             cout<<"+"<<a[j];

         }

         cout<<endl;

     }

                

     for(int i=curMax;i+curSum <=N;i++)

     {

         a[++index]=i; //向序列中加入i

         f(a,curSum+i,i);  //进行迭代

         --index; //不向序列中加入i

     }

}

 

int main()

{

    int* a;

    a=new int[N+1];

    index=0;

    memset(a,0,N+1);

    f(a,0,1);

    return 0;

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值