题目描述
小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100。但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数)。没多久,他就得到另一组连续正数和为100的序列:18,19,20,21,22。现在把问题交给你,你能不能也很快的找出所有和为S的连续正数序列? Good Luck!
输出描述:
输出所有和为S的连续正数序列。序列内按照从小至大的顺序,序列间按照开始数字从小到大的顺序
思路:
主要是数学公式:等比数列的和 ,d = 1
S = n*(n-1)/2 + a1*n
首元素a1从1开始遍历,元素个数n从2开始遍历,如果序列和S大于num则结束n的遍历,a加一
代码:
class Solution {
public:
vector<vector<int> > FindContinuousSequence(int sum) {
vector<vector<int>> ret;
//等比数列:n*(n-1)/2+a*n == num ,a为数列首项,n为数列元素个数
int a=1,n = 2;
for(; a <= sum; ++a)
{
for(n = 2;n < sum; ++n)
{
int S = n*(n-1)/2 + a*n;
if(S == sum)
{
vector<int> temp;
for(int i = 0; i < n; ++i)
{
temp.push_back(a + i);
}
if(!temp.empty())
{
ret.push_back(temp);
}
}
else if(S > sum)
break;
}
}
return ret;
}
};
其他思路:
我觉得这个思路挺好的,因此自己实现了一下:
class Solution {
public:
vector<vector<int> > FindContinuousSequence(int sum) {
vector<vector<int>> ret;
//(left+right)*(right - left + 1)/2
int left=1,right=2;
while( right <= sum/2 + 1)
{
int S = (left+right)*(right - left + 1)/2;
//当前序列和为给定的数,将序列放进数组中,
if(S == sum)
{
vector<int> temp;
for(int i = left; i <= right; ++i)
temp.push_back(i);
ret.push_back(temp);
//right右移,寻找下一个序列
++right;
}
//当前序列和小于给定的数,右指针右移
else if(S < sum)
++right;
//当前序列和大于于给定的数,左指针左移
else
++left;
}
return ret;
}
};
小结:
不得不说vector容器真好用
c++ 刷题 心得 vector声明动态一、二、三维数组、初始化以及传递参数