JSK-353 求同存异【暴力+排序+二分】

求同存异
输入两个数组(数组元素个数为 6 和 8),输出在两个数组中都出现的元素如 a[6]={2,3,4,5,6,7},b[8]={3,5,7,9,11,13,15,19},则输出 3,5,7。
输入格式
第一行输入6个整数,表示第一个数组里的6个元素。
第二行输入8个整数,表示第二个数组里的8个元素。
输出格式
输出两个数组里都出现的整数,按在第一个数组中出现的顺序输出,每行输出一个整数。
样例输入
2 3 4 5 6 7
3 5 7 9 11 13 15 19
样例输出
3
5
7

问题链接JSK-353 求同存异
问题描述:(略)
问题分析
    这个问题从数学上来说是一个判定一个集合的元素是否在另外一个集合里的问题。也是一个集合元素匹配问题。
    匹配过程中,使用排序的话则可以使用二分查找,时间上是快的。否则只能用暴力法了。
程序说明
    有关排序的算法函数,C语言的有函数qsort(),但是参数多记不住,还是C++的排序算法函数sort()更加易于使用。
    写了一个C++语言程序,使用排序和二分查找。
    也写了一个C语言程序,使用暴力法实现。暴力法是俗称,也就是枚举法,或称为穷举法。
参考链接:(略)
题记:暴力、排序和二分查找(折半查找)都是程序中最为常见的。

AC的C语言程序如下:

/* JSK-353 求同存异 */

#include <stdio.h>

#define N1 6
#define N2 8
int a[N1], b[N2];

int main()
{
    for(int i = 0; i < N1; i++)
        scanf("%d", &a[i]);
    for(int i = 0; i < N2; i++)
        scanf("%d", &b[i]);

    int i, j;
    for(i = 0; i < N1; i++)
        for(j = 0; j < N2; j++)
            if(a[i] == b[j]) {
                printf("%d\n", a[i]);
                continue;
            }

    return 0;
}

AC的C++语言程序如下:

/* JSK-353 求同存异 */

#include <bits/stdc++.h>

using namespace std;

const int N1 = 6;
const int N2 = 8;
int a[N1], b[N2];

bool find(int x)
{
    int left = 0, right = N2 - 1, mid;

    while(left < right) {
        mid = (left + right) / 2;
        if(x > b[mid])
            left = mid + 1;
        else if(x < b[mid])
            right = mid - 1;
        else
            return true;
    }

    return left == right ? (x == b[left]) : false;
}

int main()
{
    for(int i = 0; i < N1; i++)
        scanf("%d", &a[i]);
    for(int i = 0; i < N2; i++)
        scanf("%d", &b[i]);

    sort(b, b + N2);

    for(int i = 0; i < N1; i++)
        if(find(a[i]))
            printf("%d\n", a[i]);

    return 0;
}

猜你喜欢

转载自blog.csdn.net/tigerisland45/article/details/82933555