下面先贴出代码,然后再说几点应该特别注意的。
void Print(int* numbers, int start, int end)
{
for(int i = start; i<= end; ++i)
{
cout<<numbers[i];
}
cout<<endl;
}
void FindNumbers(int* numbers, int length,int k)
{
if(numbers == NULL || length <= 0)
{
return ;
}
int start, end;
start = end = 0;
int CurSum = numbers[end];
while(end < length)
{
if(CurSum == k)
{
Print(numbers, start, end);
}
while(CurSum > k && start < length)
{
CurSum -= numbers[start];
++start;
if(CurSum == k)
{
Print(numbers, start, end);
}
}
++end;
CurSum += numbers[end];
}
}
int _tmain(int argc, _TCHAR* argv[])
{
int numbers[] = {1,2,3,4,5,6,7,8};
int len = sizeof(numbers)/sizeof(int);
FindNumbers(numbers, len, 15);
getchar();
return 0;
}
第一点:我们在while循环中,最后的两句话,++end;CurSum += numbers[end];这两句话不可以放在判断语句中,为什么呢?如果我们现在拿到了第一个和为15的全部子序列,那么在打印完后,它会进入到一个死循环;所以我们应该直接放到最后面,不加判断;
第二点:CurSum要初始化为数组中的第一个数字,为什么呢?进入到while循环中,++end,得到的就是第二个数字了,所以需要先初始化为第一个数字;
第三点:在while的内层循环当中,在减去最原先的数字之后,我们应该加一个判断,为什么呢?否则无法得到后面的几个和为某一值的子序列。