题目:
连续的正数序列,使得和为指定值
分析:
以前做过类似的题目,求解两个数字和为指定值这种题目,采用先排序,然后从两头开始查找的方式,这题其实也差不多,采用两个指针,不过这次两个指针同时从头开始查找,初始化时first指针指向1,second指针指向2,如果curr_sum小于指定的sum,second指针往后移东;相反,如果curr_sum大于指定的sum,first指针往后移动。
代码如下:
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
//输出序列
void printSequence(int small, int big)
{
if(small > big)
return ;
for(int i = small; i <= big; i++)
cout << i << " ";
cout << endl;
return ;
}
int main()
{
int sum = 10001;
int small = 1;
int big = 2;
int middle = (1 + sum) / 2;
int curr_sum = small + big;
while(small < middle)
{
if(curr_sum == sum)
printSequence(small, big);
else
{
while(curr_sum > sum && small < middle) //一直循环,知道当前的和比sum小
{
curr_sum = curr_sum - small;
small++;
if(curr_sum == sum)
printSequence(small, big);
}
}
big++;
curr_sum += big;
}
return 0;
}
总结:
学会用指针,尤其多个指针,可以解决很多有意思的问题。