题目:
题目描述:
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
输出描述:
输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
方法一:
假设一个连续序列和为S,首元素为a,这列元素为a,a+1,a+2,a+3……a+n,共计n+1个元素
a+(a+1)+(a+2)+(a+3)+……+(a+n)
=(n+1)a+n(n+1)/2
=S
n从0开始,a从1到S/2循环,对于每一个a,找出一个对应的n满足上式。
class Solution {
public:
vector<vector<int> > FindContinuousSequence(int sum)
{
int n=0;
vector<vector<int> >result;
for(int a=1;a<=sum/2;a++)
{
n=0; //每轮循环重置n
while(1)
{
int mysum=(n+1)*a+n*(n+1)/2;
if(mysum==sum)
{
vector<int>tmp;
for(int i=0;i<=n;i++)
tmp.push_back(a+i);
result.push_back(tmp); //向result中push_back的元素为vector
break; //求出一个序列之后记得退出循环
}
else if(mysum<sum)
n++;
else
break;
}
}
return result;
}
};
方法二:
初始化low=1,high=2;
low到high序列和小于sum,high++;大于sum,low++;
当high增加到sum/2+1时停止,或low增加到sum/2时停止
class Solution {
public:
vector<vector<int> > FindContinuousSequence(int sum)
{
int low=1,high=2;
vector<vector<int> >result;
while(high<=sum/2+1) //sum为奇数的话,需要加1,偶数无所谓
{
int mysum=0;
for(int i=low;i<=high;i++)
mysum=mysum+i;
if(mysum==sum)
{
vector<int>tmp;
for(int i=low;i<=high;i++)
tmp.push_back(i);
result.push_back(tmp); //向result中push_back的为vector
low++; //改变循环条件
}
else if(mysum<sum)
high++;
else
low++;
}
return result;
}
};