根据medie2005(阿诺)的提示,写了以下程序,测了几组数据,还没有发现问题,正继续测试中
/**
* 正整数集合s = {a1, a2, ..., an}
* 存在 ai * aj = ak, i != j != k
* 求满足条件的最大整数k,如果不存在,则输出-1
*/
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
int array[] = { 1, 2, 3, 6, 4, 7, 19, 20, 25 , 80};
/**
* 二分查找,找到集合中不大于x的最高位置或不低于x的最低位置
*/
template<class Type>
int BinarySearch(Type arr[], const Type& x, int n)
{
int left = 0;
int right = n - 1;
while(left <= right) {
int middle = (left + right) / 2;
if(x == arr[middle])
return middle;
if(x > arr[middle])
left = middle + 1;
else
right = middle - 1;
}
return left - 1;
}
/**
* 严格的二分查找
*/
template<class Type>
int BinarySearchAccurate(Type arr[], const Type& x, int low, int high)
{
int left = low;
int right = high - 1;
while(left <= right) {
int middle = (left + right) / 2;
if(x == arr[middle])
return middle;
if(x > arr[middle])
left = middle + 1;
else
right = middle - 1;
}
return -1;
}
//打印数组arr
template<class Type>
void PrintArray(Type arr[], int n)
{
int i;
for(i = 0; i < n; ++i)
{
cout<<arr[i]<<" ";
}
cout<<endl;
}
//计算n的平方
int ComputeSquare(int n)
{
return n * n;
}
//判断double是否为一个整数
bool IsInteger(double n)
{
if(n == (int)n)
return true;
return false;
}
//求解,array为待分析的数组,n为数组长度
//如果存在,则返回ak
//否则返回-1
int Compute(int array[], int n)
{
//首先计算a[0]的平方
int temp = ComputeSquare(array[0]);
int big_pos = BinarySearch<int>(array,temp,n);
if(temp == n - 1)
{
return -1; //无解
}
else
{
//对于(big_pos, len)
for(int i = n - 1; i >= big_pos; --i)
{
temp = int(sqrt((double)array[i]));
int low_pos = BinarySearch<int>(array,temp,n);
for(int j = 0; j <= low_pos; )
{
double temp2 = (double)array[i] /(double) array[j];
if(!IsInteger(temp2))
++j;
else
{
int k = BinarySearchAccurate<int>(array, (int)temp2, low_pos + 1, i );
if(k != -1)
return array[i];
else
++j;
}
}
}
}
return -1; //无解
}
int main()
{
sort(array, array + sizeof(array)/sizeof(array[0]));
// qsort(array, sizeof(array), sizeof(array) / sizeof(array[0]));
PrintArray<int>(array, sizeof(array) / sizeof(array[0]));
// cout<<BinarySearch<int>(array,13,sizeof(array) / sizeof(array[0]))<<endl;
cout<<"Result: "<<Compute(array, sizeof(array) / sizeof(array[0]))<<endl;
return 0;
}
|