来看看题目
这个题我的理解是 将这n个数先排序
再对排好序的n个数进行循环算出两两之和
若满足两数v1+v2=m&&v1<v2则输出 且只输出满足这个条件的第一组数据(这个用flag控制)
否则输出No solution
但是这道题并没有AC 出现了段错误
#include <stdio.h>
#include <stdlib.h>
int a[101],b[101],c[101],n,m;
void quicksort(int left,int right);
int main()
{
int i,j,t;
int flag1=100000;
int flag2=-1;
scanf("%d %d\n",&n,&m);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
quicksort(1,n); //快速排序调用
for(i=1;i<=n;i++)
{
for(j=i+1;j<=n;j++)
{
if((a[i]+a[j]==m)&&(a[i]<=a[j]))
{
if(flag1>a[i]){
flag1=a[i];flag2=a[j];
}
}
}
}
if(flag2!=-1) printf("%d %d",flag1,flag2);
else printf("No Solution");
}
void quicksort(int left,int right)
{
int i,j,t,temp;
if(left>right)
return;
temp=a[left]; //temp中存的就是基准数
i=left;
j=right;
while(i!=j)
{
//先从右边开始找
while(a[j]>=temp && i<j)
{
j--;
}
//再找左边的
while(a[i]<=temp && i<j)
{
i++;
}
//交换两个数在数组中的位置
if(i<j)
{
t=a[i];
a[i]=a[j];
a[j]=t;
}
}
//最终将基准数归位
a[left]=a[i];
a[i]=temp;
quicksort(left,i-1);//递归处理左边
quicksort(i+1,right);//递归处理右边
}