将整数nSum拆分成num个数的和的形式——阿里巴巴笔试题

将一个整数nSum分解成num个整数和的形式,如nSum=6num=3那么,nSum就可以分解成为1 1 41 2 3222。请编程实现!

 

方法解析:采用递归的算法,分解时,层次(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");
}


测试结果如下:


 

 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值