题号1101的大意为:


给定N (1 <= N <= 1000)个不同的位于-536870912-536870911 之间的整数,求其中是否存在一个数是其他三个数之和,且这四个数各不相同.如果存在,输出满足条件的最大值,否则,输出no solution 。
给定多组测试数据,N=0表示结束。

Sample Input
5
2
3
5
7
12
5
2
16
64
256
1024
0

Output for Sample Input
12
no solution

今天编写了源代码:但提交时显示,答案错误:各位高手帮忙看看啊,源程序如下:

#include <iostream>
using namespace std;
int partition(long *p, int l, int r);
/***************************************************************************
*函数原型:void puicksort(long *p, int l, int r)  
*函数功能:利用快速排序法对p指向的数组进行排序,l和r分别p指向的数组的第一个
*          元素和最后一个元素的下标值
*返回值:  无;
****************************************************************************/
void quicksort(long *p, int l, int r)
{
int seat = 0;
if (l < r)
{
  seat = partition(p, l, r);
  quicksort(p, l, seat-1);
  quicksort(p, seat+1, r);
}
}

/***************************************************************************
*函数原型:int partition(long *p, int l, int r)
*函数功能:对p[l]定位,使其左边的数小于等于它,右边的数大于它
*返回值:  返回p[l]表示的数排序后新的位置坐标;
****************************************************************************/
int partition(long *p, int l, int r)
{
int lo = 0;
int ri = 0;
long temp = 0;

lo = l;
ri = r;
while (lo < ri)
{
  while (p[lo] <= p[l])
  {
   lo++;
  }

  while (p[ri] > p[l])
  {
   ri--;
  }
  if (lo < ri)
  {
   temp = p[lo];
   p[lo] = p[ri];
   p[ri] = temp;
  }
}
temp = p[l];
p[l] = p[ri];
p[ri] = temp;
return ri;
}

/************************************************************************************
*函数原型:int backout_find(long *p, int l, int r, long n)
*功能:查找p指向的数组(已经按从小到大排好序)中是否存在数n;
*形参说明:l,r分别为待查找的数组的第一个元素和最后一个元素的下标值,n为待查找的数;
*返回值说明:存在则返回1;否则返回0;
*************************************************************************************/
int backout_find(long *p, int l, int r, long n)
{
int mid = 0;
while (l <= r)
{
  mid = (l + r) / 2;
  if (p[mid] == n)
  {
   return 1;
  }
  else if (p[mid] > n)
  {
   r = mid - 1;
  }
  else
  {
   l = mid + 1;
  }
}

return 0;
}

/***************************************************************************
*函数原型:int compare(long *p, int n, long N)  
*函数功能:p指向从小到大的有序数组,n为该数组的个数,查找p指向的数组中是否有
*          三个元素的和为N
*返回值:  若存在则返回 1,否则返回 0;
****************************************************************************/

int compare(long *p, int n, long N)
{
int i = 0;
int j = 0;
int k = 0;
int m = 0;
long temp = 0;

for (i=0; i<n-2; i++)
  for (j=i+1; j<n-1; j++)
  {
   temp = N - p[i] - p[j];   //计算N与任意两个数的差值;

   if (temp == N)           //排除当两个数的和为0的情况;
   {
    for (k=n-1; k>j; k--)
    {
     if (p[k] < N)
     {
      break;
     }
     if(p[k] == N)
     {
      m++;

     }
    }

    if (m > 1)
    {
     return 1;
    }
    else
    {
     return 0;
    }
   }
   if (backout_find(p, j+1, n-1, temp) == 1)
   {
    return 1;
   }
   
  }
return 0;
}

/*********************************************************************************
*
*                            主函数
*
**********************************************************************************/
int main(void)
{
int n = 0;
int i = 0;
int k = 0;
long p[1000];

cin >> n;
while (n != 0)
{
  k = 0;
  for (i=0; i<n; i++)  //读入数据并将其存入数组中;
  {
   cin >> p[i];
  }

  quicksort(p, 0, n-1);      //对数组进行从小到大的排序;

  for (i=n-1; i>=3; i--)        //对数组中的元素从大到小判断其是否为其它三个数的和;
  {
   if ((k = compare(p, n, p[i])) == 1)
   {
    cout << p[i] << endl;
    break;
   }
  }
  if (k == 0)
  {
   cout << "no solution" << endl;
  }
  cin >> n;
}

return 0;
}