题目描述:
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
输出描述:
输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序。
代码总结在github仓库:
https://github.com/Rayholle/LeetCode-Newcoder/blob/master/STL/和为s的连续整数序列.cpp
解题思路:
根据公式:s = (low + high)*(high-low+1)/2(普通的求和公式,low为最小值,high为最大值)
我们需要做的就是设置low,high,并遍历所有连续的整数(限定条件:low<high)
代码如下:
vector<vector<int> > FindContinuousSequence(int sum) {
int plow = 1;
int phigh = 2;
vector<vector<int>> ret;
while(plow < phigh){
int cur = (plow+phigh)*(phigh-plow+1)/2;//求和公式计算当前和
if(cur < sum)//若小于sum,则phigh++
phigh++;
if(cur == sum){
vector<int> temp;
for(int i = plow; i<= phigh; i++){
temp.push_back(i);
}
ret.push_back(temp);
plow++;
}
if(cur > sum)//若大于sum,则plow++
plow++;
}
return ret;
}
在遍历过程中,符合要求的plow-phigh之间的数值,存入数组向量中。