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