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

来源:互联网 发布:便笺元数据 编辑:程序博客网 时间:2024/06/05 09:29

在网上经常看到这样的类似题: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;

}


原创粉丝点击