方法一:直接两层循环(O(N*N))
// Find_Sum.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
void find_sum(int a[],int n ,int sum,int *first,int* second)
{
int num1,num2;
for(int i=0;i<n;i++)
{
num1=a[i];
for(int j=i;j<n;j++)
{
num2=a[j];
if (num1+num2==sum)
{
*first=num1;
*second=num2;
}
}
}
}
int _tmain(int argc, _TCHAR* argv[])
{
//1、2、4、7、11、15
int a[]={1,2,4,7,11,15};
int first,second;
find_sum(a,6,15,&first,&second);
printf("first : %d\n",first);
printf("secong :%d\n",second);
system("pause");
return 0;
}
方法二:先对数组进行快速排序(O(nlogn))
// FindTwoNum2.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
int Divion(int a[],int left,int right)
{
int base =a[left];
while (left<right)
{
while(left<right && a[right]>base)
--right;
a[left]=a[right];
while(left<right && a[left]<base)
++left;
a[right]=a[left];
}
a[left]=base;
return left;
}
void QuickSort(int a[],int left,int right)
{
int i=0;
if (left<right)
{
i=Divion(a,left,right);
QuickSort(a,left,i-1);
QuickSort(a,i+1,right);
}
}
bool FindTwoNum(int a[],int sum,int n,int *first,int *second)
{
QuickSort(a,0,n-1);
for (int i=0,j=n-1;i<j;)
{
if ((a[i]+a[j])==sum)
{
*first=a[i];
*second=a[j];
return true;
}
else if((a[i]+a[j])>sum)
--j;
else
++i;
}
return false;
}
int _tmain(int argc, _TCHAR* argv[])
{
int a[]={1,2,4,7,11,15};
int first,second;
bool result=FindTwoNum(a,15,6,&first,&second);
printf("排序后");
for (int i=0;i<6;i++)
{
printf("%3d ",a[i]);
}
printf("\n");
if (result)
{
printf("first : %d\n",first);
printf("secong :%d\n",second);
system("pause");
}
else
{
printf("没找到\n");
system("pause");
}
return 0;
}