和为S的连续正数序列 解题思路

题目描述:小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!


输出描述:输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序。


解题分析:本题中提到的连续序列其实是一组等差序列,等差d为1。

等差序列的求和公式:    (1)式

题目中提到为连续的整数序列,可知,,

(1)式可转化为:

由于,所以可知 ,所以

由上边的分析可知和为S的最长连续序列的长度不会超过,又至少包括2个数,所以

所以从长度开始依次遍历,通过等差求和公式可计算出首项


代码:

class Solution {

public:

    vector > FindContinuousSequence(int sum) {

        int max_n=sqrt(2*sum);//连续序列的最长长度

        vector> result; //存放序列

        for(int i=max_n;i>=2;i--){//序列长度需大于等于2,小于max_n

            int a1=(2*sum+i-pow(i,2))/(2*i); //计算首项,可能除不尽,还需判断

            if((2*a1+i-1)*i==2*sum){ //判断能否组成连续序列且和为sum

                vector re; //存放当前连续序列

                for(int j=a1;j

                    re.push_back(j);

                }

                result.push_back(re);

            }

        }

        return result;//返回结果

    }

};


运行时间:3ms  占用内存:488k

你可能感兴趣的:(和为S的连续正数序列 解题思路)