将一个整数nSum分解成num个整数和的形式,如nSum=6,num=3那么,nSum就可以分解成为1 1 4;1 2 3;222。请编程实现!
方法解析:采用递归的算法,分解时,层次(nDepth,基于0)每深一层,其层所对应的值就应该不比上一层的值小,所以循环体中变量i应从上一层的值开始,直到nSum/num时截止,因为最后一组最大情况应都为nSum/num。其中nDepth+num的值为总的分解个数。
代码如下:
#include <iostream>
using namespace std;
///
// nSum: 待拆分的参数;
// num: 当前递归层要拆分的个数
// pData: 存放每一个拆分单元
// nDepth: 拆分的深度(基于0)
// num+nDepth之和为最终要拆分的总个数
void SegNum(int nSum, int num, int* pData, int nDepth)
{
if (1 == num)
{
pData[nDepth] = nSum;
for (int j=0; j<num+nDepth; j++)
cout<<pData[j]<<" ";
cout<<endl;
}
else
{
//如果深度为0,那么i从1开始索引;
//否则,i从上一深度所对应值开始索引。
int i = (nDepth == 0 ? 1 : pData[nDepth-1]);
// i值最大为nSum/num
for (; i<= nSum/num; i++)
{
pData[nDepth++] = i;
SegNum(nSum-i, num-1, pData, nDepth);
nDepth--;
}
}
}
测试代码如下:
int main()
{
int nSum = 10;
int num = 3;
cout << "nSum = " << nSum << endl;
cout << "num = " << num << endl;
int* pData = new int[num];
SegNum(nSum, num, pData, 0);
if (pData!=NULL)
{
delete pData;
pData=NULL;
}
system("pause");
}
测试结果如下: