找到和为S的所有连续正整数序列

找到所有和为S的连续正整数序列,最直接的思路便是从1开始累加,若是和 cur_sum 小于S,则继续累加,若是大于S,则删除序列中最小的数small,继续直到big大于S的一半+1为止(否则和一定会超过S,便没有继续下去的意义了)。当等于S的时候输出此序列,然后sur_sum减去small继续寻找下一个序列。

比如:

5  --->2+3

100 --->9+10+...+16     和   18+19+...+22

 

代码如下:

#include
void print(int begin, int end)
{    //输出函数
	int i = begin;
	while (i <= end)
	{
		printf("%d ", i);
		i++;
	}
	printf("\n");
}
void my_find(int Sum)
{
	if (Sum < 3) //若是小于3,就没有必要求了
	{
		printf("数值过小,无结果\n");
		return;
	}
	int small = 1;
	int big = 2;
	int mid = (1 + Sum) / 2;
	int cur_sum = small + big;
	while (small < mid)
	{
		if (cur_sum == Sum)
		{
			print(small, big);
			cur_sum -= small;   //先减再加
			small++;
			
		}
		else if (cur_sum < Sum)
		{
			//先加下一个big,否则会多加一次 big
			big++;  //大值往后跳
			cur_sum += big;
		}
		else
		{
			cur_sum -= small;
			small++;
		}
	}
}
int main()
{
	my_find(3);
	my_find(9);
	my_find(10);
	my_find(12);
	my_find(100);

	system("pause");
	return 0;
}

结果如下:

找到和为S的所有连续正整数序列_第1张图片

你可能感兴趣的:(刷题,c)