题目描述:
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
思路:
思路1:从第一个1为首项,第二个2为末项开始往后遍历,并累加计算和,如果累加的和大于sum,则首项向前加1(同时项数减去1),如果和小于sum,则末项向前加1(同时项数加1)。一直下去,直到当末项小于首项为终止条件。
思路2:假设存在一个等差数列首项是a,末项是b,总的项目数是i,首项和末项之和是j,综合是sum,则一定满足i*j等于2*sum,则一定要满足:i=b-a+1,j=a+b,j-i=2a-1,并且j-i=2a-1>0(因为a>1的),所以一定j>i,所以一定满足i*i<2*sum。
代码(思路1):
class solution
{
public:
vector<vector<int>> FindContinuousSequence(int sum)
{
int begin=1;
int end=2;
vector<vector<int>> result;
while(begin<end)
{
int tempSum=(begin+end)*(end-begin+1)/2;
if(tempSum==sum)
{
for(int i=begin;i<=end;i++)
{
vector<int> tempResult;
tempResult.push_back(i);
}
result.push_back(tempResult);
}
else if(tempSum>sum)
{
begin++;
}
else
{
end++;
}
}
return result;
}
}
代码(思路2) :
//等差数列前n项之和公式:sum=n*(a1+an)/2
class solution
{
public:
vector<vector<int>> FindContinuousSequence(int sum)
{
int sqrtofSum=sqrt(2*sum);//最大的项数i<sqrt(2*sum)
vector<vector<int>> result;
for(int i=sqrtofSum;i>=2;i--)
{
if((2*sum)%i==0)//对应的项数存在首末项之和
{
int j=(2*sum)/i;//首末项之和
if((j-i+1)%2==0)//首项的两倍,一定得满足j-i=2a-1
{
vector<int> tempResult;
int begin=(j-i+1)/2;
while(i--)
{
tempResult.push_back(begin);
begin--;
}
result.push_back(tempResult);
}
}
}
return result;
}
}