给定两个整型数组,本题要求找出不是两者共有的元素。
输入格式:
输入分别在两行中给出两个整型数组,每行先给出正整数N(≤20),随后是N个整数,其间以空格分隔。
输出格式:
在一行中按照数字给出的顺序输出不是两数组共有的元素,数字间以空格分隔,但行末不得有多余的空格。题目保证至少存在一个这样的数字。同一数字不重复输出。
输入样例:
10 3 -5 2 8 0 3 5 -15 9 100
11 6 4 8 2 6 -5 9 0 100 8 1
输出样例:
3 5 -15 6 4 1
代码展示:
#include <stdio.h>
// 接受输入到数组中
void getNums(int n, int *num)
{
for (int i = 0; i < n; ++i)
scanf("%d", num + i);
}
// 自我去重
void selfCheck(int a[], int al, int at[])
{
// 对a[]自己去重复
for (int i = 0; i < al - 1; ++i)
{
// 若为重复元素 - 跳过
if (a[i] == 1)
continue;
// 不为重复元素 - 向后检查
for (int j = i + 1; j < al; ++j)
if (a[i] == a[j] && !at[j])
at[j] = 1;
}
}
// 将数组中标记为0的复制到结果数组中
void copy(int a[], int al, int at[], int c[], int *cl)
{
for (int i = 0; i < al; ++i)
if (!at[i])
c[(*cl)++] = a[i];
}
int main(void)
{
// 结果数组与长度
int c[40], cl = 0;
// 数组长度
int al, bl;
// 数组内容
int a[20] = {0}, b[20] = {0};
// 数组标记
int at[20] = {0}, bt[20] = {0};
// 接受输入
scanf("%d", &al);
getNums(al, a);
scanf("%d", &bl);
getNums(bl, b);
// 对a[],b[]自己去重复
selfCheck(a, al, at);
selfCheck(b, bl, bt);
// 相互去重
for (int i = 0; i < al; ++i)
{
// 重复元素不比较
if (at[i])
continue;
// 比较b数组
for (int j = 0; j < bl; ++j)
{
// 重复元素不比较
if (bt[j])
continue;
// 找到重复,双方标记,跳出循环
if (a[i] == b[j])
{
at[i] = bt[j] = 1;
break;
}
}
}
// 将标记为0的元素放入c数组中
copy(a, al, at, c, &cl);
copy(b, bl, bt, c, &cl);
// 输出结果数组
printf("%d", c[0]);
for (int i = 1; i < cl; ++i)
printf(" %d", c[i]);
printf("\n");
return 0;
}