题目
练习7-4 找出不是两个数组共有的元素 (20 分)
给定两个整型数组,本题要求找出不是两者共有的元素。
输入格式:
输入分别在两行中给出两个整型数组,每行先给出正整数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
分析
有两个条件,1.按照数字给出的顺序输出不是两数组共有的元素,2.同一数字不重复输出。
不改变原始顺序的去重:删去一个重复元素后,修改整个大循环的限定条件。
通常来说for循环的条件表达式是一个固定的数,但这里它根据需要进行了调整。
代码
#include<stdio.h>int main(){int n,m,i,j,a[21],b[21],c[50],k=0;scanf("%d",&n);for(i=0;i<n;++i){scanf("%d",&a[i]);}scanf("%d",&m);for(i=0;i<m;++i){scanf("%d",&b[i]);}for(i=0;i<n;++i){//查第一个数组有,第二个数组无的元素for(j=0;j<m;++j){if(a[i]==b[j]) break;}if(j==m){c[k]=a[i];k++;}}for(i=0;i<m;++i){//查第二个数组有,第一个数组无的元素for(j=0;j<n;++j){if(a[j]==b[i]) break;}if(j==n){c[k]=b[i];k++;}}int l;for(i=0;i<k;++i){//数组去重,不改变原始顺序,并更新数组for(j=i+1;j<k;++j){if(c[i]==c[j]){for(l=j+1;l<k;++l){c[l-1]=c[l];}k=k-1;//重复的去掉,因此数组长度减一}}}for(i=0;i<k;++i){if(i==0)printf("%d",c[i]);elseprintf(" %d",c[i]);}
}