思路:首先对无序自然数数列进行排序(升序),然后定义i和j分别指向数列的两端,所指两数之和分别和M作比较,比M大,则j左移,比M小,则i右移。
代码如下:
#include <stdio.h>
#include <stdlib.h>
//快排
void sort(int *a, int left, int right)
{
if(left >= right)
{
return ;
}
int i = left;
int j = right;
int key = a[left];
while(i < j) /*控制在当组内寻找一遍*/
{
//双向比较
while(i < j && key <= a[j])
{
j--; //向前寻找
}
a[i] = a[j]; //交换位置
while(i < j && key >= a[i])
{
i++; //向后寻找
}
a[j] = a[i]; //交换位置
}
a[i] = key;
sort(a, left, i - 1);
sort(a, i + 1, right);
}
int main()
{
int a[10] = {-2,1,3,4,-5,12,45,34,23,9};
int M = 26;
int i, j;
for(i = 0; i < 10; i++)
printf("%d ",a[i]);
printf("\n");
sort(a, 0, 9);
for(i = 0; i < 10; i++)
printf("%d ",a[i]);
printf("\n");
i = 0;
j = 9;
while(i < j)
{
if(a[i] + a[j] == M)
break;
if(a[i] + a[j] > M)
j--;
else
i++;
}
if(i != j)
printf("%d + %d = %d\n",a[i],a[j],M);
else
printf("NO FIND!\n");
return 0;
}