2011-06-14 17:29:10
from编程之美2.21
问题描述:将一个正整数,拆分成连续的自然数之和,输出所有可能的情况
例如: 3 = 1+2
10 = 1+2+3+4
16 = 5+6+7
...
问题求解:
连续的自然数之和让我们想到了等差数列求和公式:
其中Sum为要分解的正整数,n为连续自然数的个数,aFirst为连续自然数的第一位数
将以上公式改写成另外一种格式
求解得到连续自然数个数n:
如果一个数可以分解为几个连续自然数之和,那么就意味着方程有解,那么对于相应的解就有如下限制,
必须为平方数且开根号的结果必须为奇数
需要注意一点的是:由于是连续自然数,所以首项aFirst必定不可能大于n/2,所以不需要从1-n遍历,只需要从1- n/2 遍历即可
c++代码如下所示
结果如下图所示: