和为n连续正数序列

题目描述:

输入一个正数n,输出所有和为n连续正数序列。

例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-54-67-8

 

分析:

来源于互联网 以下仅给出思路

解法一:两个for循环解决,复杂度O(n2)

 

 

解法二:

因为整数序列有序,可以设立两个游标satrt,end,通过判区间[start,end]的和是否为n来得到这个序列。如果区间和大于n,start往前移动,如果小于n,end往前移动,等于就输出这个区间。时间复杂度是0(n).

 

 

解法三:

假设 start + (start + 1) + ... + end = n 是一个答案,则根据求和公式就是 (start + end) * (end - start + 1) / 2 = n, 则 (start + end)和 (end -start + 1)分别是2n的一个因子,枚举其中一个,就可以判断求出第二个,然后求出start和end了。时间复杂度是O(sqrt(n)).2n的因子范围肯定在[2,sqrt(2n)]之间。

具体步骤:假设(end - start + 1)是其中一个因子,可以通过2n%i == 0找到一个因子i,令i = end - start + 1 则start + end = 2 * start + i - 1 然后根据上面的(start + end)*(end - start + 1)/2 = n的公式可以推导出 2*start*i = 2n - i^2 + i, 因此只要判断start存在正整数解,就可以知道满足上面条件的2n的另一个因子也是存在的。

 

 

 

 

 

 

 

 

posted on 2012-09-19 13:19  as_  阅读(1136)  评论(0编辑  收藏  举报

导航