剑指Offer——和为S的连续正数序列

题目描述:

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


分析:

假设 i,j 分别是第一个数和最后一个数,那么根据 (i+j)*(j-i+1)/2=sum 可得 i+j-i^2+j^2=2*sum 。遍历i从1到sum/2,求j。
由于 j+j^2=2*sum-i^2-i ,所以 j 可能取 floor(sqrt(2*sum-i^2-i)) ,如果 j 可取,则将 i 到 j 加入数组中。


代码:

 1 class Solution {
 2 public:
 3     vector<vector<int> > FindContinuousSequence(int sum) {
 4         vector<vector<int> > seqs;
 5         for(int i = 1; i <= (sum >> 1); i++) {
 6             int j = floor(sqrt((sum << 1) + i * i - i));
 7             if(i < j && i + j - i * i + j * j == (sum << 1)) {
 8                 vector<int> seq;
 9                 for(int k = i; k <= j; k++)
10                     seq.push_back(k);
11                 seqs.push_back(seq);
12             }
13         }
14         return seqs;
15     }
16 };

 

posted @ 2017-11-01 11:10  叶建成  阅读(130)  评论(0编辑  收藏  举报