/********************************************************************
题目:输入一个数组和一个数字,在数组中查找两个数,
使得它们的和正好是输入的那个数字。
如果有多对数字的和等于输入的数字,输出任意一对即可。
例如输入数组1、2、4、7、11、15和数字15。由于4+11=15,因此输出4和11。
方法:
1,分别从数组前,数组后向中间查找。直到前后相遇!!
2,当前得到currentSum>sum说明:大的数太大(数组递增,后面的数太大)。
应该将指向最后的标记向前挪动
3,当前得到currentSum<sum说明:大的数太小(数组递增,前面的数太小)。
应该将指向最后的标记向后挪动
4,当前得到currentSum=sum说明:找到答案
***************************************************************************/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<time.h>
using namespace std;
void Random(int a[],int n)
{
int i=0;
srand( (unsigned)time( NULL ) );
while(i<n)
{
a[i++]=rand()/999;
}
}
template <class T>
struct numSum
{
T big;
T small;
};
bool FindTwoNumbers(int data[],unsigned int length,int sum, numSum <int> &num )
{ //num1,num2采用的是地址,如果方法内改变则改变的是调用实参的值
bool found = false;
if(length < 1)
return found;
int begin = 0;
int end = length - 1;
while(end > begin)
{
long curSum = data[begin] + data[end];
if(curSum == sum)
{
num.small = data[begin];
num.big = data[end];
found = true;
break;
}
else if(curSum > sum)
end--;
else
begin++;
}
return found;
}
int main()
{
int a[20];
Random(a,20);
for(int i=0;i<20;i++)
{
cout<<" "<<a[i]<<" ";
}
cout<<endl<<"-------------------"<<endl;
sort(a,a+20);
for(int i=0;i<20;i++)
{
cout<<" "<<a[i]<<" ";
}
cout<<endl<<"-------------------"<<endl;
numSum <int> number;
int sum=25;
FindTwoNumbers(a, 20,sum, number);
cout<<number.small<<" + "<<number.big<<" = "<<sum<<endl;
return 0;
}
/******************************************
31 25 31 26 21 28 1 12 32 7 4 11 20 14 23 20 28 8 25 5
-------------------
1 4 5 7 8 11 12 14 20 20 21 23 25 25 26 28 28 31 31 32
-------------------
4 + 21 = 25
Process returned 0 (0x0) execution time : 2.007 s
Press any key to continue.
*******************************************