代码改变世界

算法100题14

2011-09-16 19:51  justvi  阅读(247)  评论(0编辑  收藏  举报

/* 题目来自:http://blog.csdn.net/v_JULY_v

 * 题目14:输入一个已经按升序排列过的数组和一个数字,在数组中找出两个数,使的它们的和正好等于这个数字

 * 如1,2,4,7,11,15和数字15,则可以输出4和11

 * 方法:(可见《编程之美》)  初始化i,j分别指向数组开头和结尾,因为数组升序排列,则若arr[i]+arr[j]大于输入数,则可以确定此刻的arr[j]必不满足条件,因为它与最小的数字相加

 * 都大于输入数,则可以缩小范围(j--),同理可以处理i直至满足条件。*/  

 1 #include <stdio.h>
2
3 void find(int *a, int len, int x)
4 {
5 int i, j;
6 for (i = 0, j = len - 1; i < j; )
7 {
8 if (a[i] + a[j] == x)
9 {
10 printf("%d, %d\n", a[i], a[j]);
11 return;
12 }
13 else if (a[i] + a[j] > x)
14 j--;
15 else
16 i++;
17 }
18 printf("no such nums\n");
19 }
20
21 int main()
22 {
23 int arr[] = {1, 2, 4, 7, 11, 15};
24 int len = sizeof(arr) / sizeof(arr[0]);
25 find(arr, len, 15);
26 return 0;
27 }