主题:你能找出这个程序哪里出错了吗?
题号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;
}
给定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;
}