题目描述
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
输出描述:
输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
感想:这题我之前的想法是用sum除以i=sqrt(sum),……1;以商为中心两边扩展。但是被自己写的逻辑绕晕了,参考了一下剑指的写法。简单多了。但是时间复杂度不小。
//和为S的连续正数序列
#include <iostream>
#include <vector>
using namespace std;
int count(int small,int big)
{
int sum=0;
while(small<=big)
{
sum+=small;
small++;
}
return sum;
}
vector<vector<int> > FindContinuousSequence(int sum) {
vector<vector<int>> v2d;
vector<int> v;
if(sum==0)
return v2d;
int small=1,big=2;
while(small<=(1+sum)/2)
{
int sum_temp=count(small,big);
if(sum_temp<sum)
big++;
else if(sum_temp>sum)
small++;
else
{
for(int i=small;i<=big;i++)
v.push_back(i);
v2d.push_back(v);
v.clear();
big++;
}
}
return v2d;
}
void main()
{
vector<vector<int>> v2d;
v2d=FindContinuousSequence(2);
for(int i=0;i<v2d.size();i++)
{
for(int j=0;j<v2d[i].size();j++)
cout<<v2d[i][j]<<' ';
cout<<endl;
}
system("pause");
}