题目描述:
输入一个正数n,输出所有和为n连续正数序列。
例如输入15,由于1+2+3+4+5=4+5+6=7+8=15,所以输出3个连续序列1-5、4-6和7-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的另一个因子也是存在的。