题目来源:http://bbs.csdn.net/topics/390885270
题目:在一个正整数集合S中,找出一个最大数C,使得C=A+B,其中A和B也是S种的元素。。。
首先,我们将数组从小到大进行快速排序,
1、将最后一个数设为最大数S;
2、用第一个数A和倒数第二个数B相加,如果结果比S大,说明B太大了,那么移动为倒数第三个数;如果比S小,说明A太小了,移动为第二个数。如果相等,直接返回A,B
3、直到AB的索引相遇还找不到结果与S一样的,将S变为倒数第二个数,再循环进行以上操作
代码如下:
#include <iostream>
#include <algorithm>
using namespace std;
bool FindTwo(int nAry[], int nMaxCount, int& n1, int& n2)
{
for (int i = nMaxCount; i > 0; i--)
{
int nSumMax = nAry[i - 1];
int nBegin = 0;
int nEnd = nMaxCount - 1;
while (nBegin != nEnd)
{
int nTemp = nAry[nBegin] + nAry[nEnd];
if (nTemp == nSumMax)
{
n1 = nAry[nBegin];
n2 = nAry[nEnd];
return true;
}
else if (nTemp < nSumMax)
{
nBegin++;
}
else
{
nEnd--;
}
}
}
return false;
}
int main()
{
const int MAX_COUNT = 10;
int nAry[MAX_COUNT] = {8, 5, 7, 8, 8, 10, 7, 20, 11, 8}; // {5, 3, 4, 5, 3, 7, 8, 9, 6};
sort(nAry, nAry + MAX_COUNT);
int n1 = 0;
int n2 = 0;
if (FindTwo(nAry, MAX_COUNT, n1, n2))
{
cout << "sum: " << n1 + n2 << endl;
cout << "factor: " << n1 << ends << n2 << endl;
}
else
{
cout << "not found" << endl;
}
return 0;
}
另外,如果将步骤二使用二分法查找,那会快许多,只需要把代码中
nBegin++ 改为 nBegin = nBegin + __max(1, (nEnd - nBegin) / 2);
nEnd-- 改为 nEnd = nEnd - __max(1, (nEnd - nBegin) / 2);
就可以了。