您的位置:首页 > 其它

和为定值的两个、三个、多个、连续正数序列

2014-08-02 10:54 399 查看

1.和为定值的两个数、三个数

如果无序,先排序,排完序后,用left、right前后两个指针往中间扫(从两头夹逼),直到找到合适的数为止。

1.1和为定值的两个数

#include <stdio.h>
#include <stdlib.h>

int cmp(const void *a, const void *b)
{
	int *c = (int *)a;
	int *d = (int *)b;
	
	return (*c > *d) ? 1 : -1;
}

int add(int *A, int n, int sum)
{
	int curSum, v1, v2;
	int flag = 0;
	int left = 0; /*左指针*/
	int right = n-1; /*右指针*/
	

	while (left < right)
	{
		curSum = A[left] + A[right];
		
		if (curSum == sum)
		{
			v1 = A[left++];
			v2 = A[right--];
			

			flag = 1;
			printf("v1=%d, v2=%d\n", v1, v2);
		}
		else if (curSum < sum)
		{
			++left;
		}
		else
		{
			--right;
		}
	}
	

	return flag;
}



1.2和为定值的三个数

#include <stdio.h>
#include <stdlib.h>

int cmp(const void *a, const void *b)
{
	int *c = (int *)a;
	int *d = (int *)b;
	
	return (*c > *d) ? 1 : -1;
}

int add(int *A, int n, int sum)
{
	int curSum, v1, v2, v3;
	int flag = 0;
	int index, left, right;
	
	for (index=0; index<n; ++index) /*多了一个左指针起始位置的循环*/
	{
		left = index + 1; /*左指针的起始位置,这点和两个的不同*/
		right = n - 1;  /*右指针*/
		
		while (left < right)
		{
			curSum = A[index] + A[left] + A[right];
			
			if (curSum == sum)
			{
				v1 = A[index];
				v2 = A[left++];
				v3 = A[right--];
				
				flag = 1;
				printf("v1=%d, v2=%d, v3=%d\n", v1, v2, v3);
			}
			else if (curSum < sum)
			{
				++left;
			}
			else
			{
				--right;
			}
		}
	}
	
	return flag;
}

2.和为定值的多个数

#include <vector>
#include <iostream>
using namespace std;

void findFactor(vector<int> &vec, int n, int sum)
{
	if (n<=0 || sum<=0) /*退出的条件*/
	{
		return ;
	}

	/*找到结果,打印输出*/
	if (n == sum)
	{
		vector<int>::iterator iter;

		for(iter=vec.begin(); iter!=vec.end(); ++iter)
		{
			cout<<*iter<<" + ";
		}
		cout<<n<<endl;
		return ;
	}

	vec.push_back(n); /*使用n*/
	findFactor(vec, n-1, sum-n); /*剩下的n-1个数填满sum-n*/

	vec.pop_back(); /*不使用n*/
	findFactor(vec, n-1, sum); /*剩下的n-1个数填满sum*/
}

int main(void)
{
	int n, sum;

	while (cin>>n>>sum)
	{
		cout<<"所有可能的组合:"<<endl;
		vector<int> vec;
		findFactor(vec, n, sum);
	}

	return 0;
}

3.和为定值的连续正数序列

#include <stdio.h>

void print(int left, int right)
{
	int i;
	
	for (i=left; i<right; ++i)
	{
		printf("%d ", i);
	}
	printf("%d\n", i);
}

int findContinuousSequence(int sum)
{
	int find = 0;
	int left = 1;
	int right = 2;
	int end = (1 + sum) / 2;
	int curSum = left + right;

	if (sum < 3)
	{
		return 0;
	}
	
	while (left < end)
	{
		if (curSum > sum)
		{
			curSum -= left;
			++left;
		}
		else
		{
			if (curSum == sum)
			{
				find = 1;
				print(left, right);
			}

			++right;
			curSum += right;
		}
	}
	
	return find;
}

int main(void)
{
	int sum;
	
	while (scanf("%d", &sum)!=EOF && sum>=0)
	{
		int find = findContinuousSequence(sum);
		
		if (0 == find)
		{
			printf("Pity!\n");
		}

		printf("#\n");
	}
	
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: