用数组来刻划集合。编写程序,功能如下:通过键盘,分别输入两个数据元素类型为正整数的集合A和B,每个集合以负数输入为结束条件(该负数不是集合的元素)。在屏幕上输出两个集合的并的结果。
例如 输入: A={1,2,3,4,5} B={3,4,5,6,7}
输出 A并B={1,2,3,4,5,6,7}
方法1:先把两个集合合并为一个集合,然后在一个集合里查重
#include<stdio.h>
#define N 1000
int main()
{
int a[N],b[N],c[N],n=0,m=0,p=0,t=0,u,k;
for(int i=0;i<N;i++)
{
scanf("%d", &a[i]);
n++;
if(a[i]<0)
break;
}
for(int i=0;i<N;i++)
{
scanf("%d", &b[i]);
m++;
if(b[i]<0)
break;
}
for(int i=0;i<n+m-2;i++)
c[i]=a[i];
for(int j=0;j<m-1;j++)
{
c[j+n-1]=b[j];
}
for(int i=0;i<n+m-2;i++)
for(int j=0;j<n+m-2;j++)
{
if(a[i]==a[j])
t++;
if(t!=1)
u=i;
}
for(int i=0;i<n+m-2;i++)
for(int j=0;j<i;j++)
if(c[j]==c[i])
c[i]=-1;
for(int i=0;i<n+m-2;i++)
if(c[i]!=-1)
printf("%d ", c[i]);
}
方法2 错误:先把a数组中与b数组中重复的设为负数,当输出a数组时,if>0则输出,把a数组输出完后,输出b数组
错误原因:如果a或者b数组他们自己中间有重复的话,则有bug
#include<stdio.h>
#define N 1000
int main()
{
int a[N],b[N],c[N],n=0,m=0,p=0;
for(int i=0;i<N;i++)
{
scanf("%d", &a[i]);
n++;
if(a[i]<0)
break;
}
for(int i=0;i<N;i++)
{
scanf("%d", &b[i]);
m++;
if(b[i]<0)
break;
}
for(int i=0;i<n-1;i++)
for(int j=0;j<m-1;j++)
{
if(a[i]==b[j])
{
a[i]=-1;
continue;
}
}
for(int i=0;i<n-1;i++)
if(a[i]>0)
printf("%d ", a[i]);
for(int i=0;i<m-1;i++)
printf("%d ", b[i]);
return 0;
}
方法2正解添加核心代码:
这段代码是专门一个数组之中查重!经常用请记住!!!
for(int i=0;i<n-1;i++)
for(int j=0;j<i;j++)
if(a[j]==a[i])
a[i]=-1;
for(int i=0;i<n-1;i++)
if(a[i]!=-1)
printf("%d ", a[i]);
#include<stdio.h>
#define N 1000
int main()
{
int a[N],b[N],c[N],n=0,m=0,p=0;
for(int i=0;i<N;i++)
{
scanf("%d", &a[i]);
n++;
if(a[i]<0)
break;
}
for(int i=0;i<N;i++)
{
scanf("%d", &b[i]);
m++;
if(b[i]<0)
break;
}
for(int i=0;i<n-1;i++)
for(int j=0;j<m-1;j++)
{
if(a[i]==b[j])
{
a[i]=-1;
continue;
}
}
for(int i=0;i<n-1;i++)
for(int j=0;j<i;j++)
if(a[j]==a[i])
a[i]=-1;
for(int i=0;i<n-1;i++)
if(a[i]!=-1)
printf("%d ", a[i]);
for(int i=0;i<m-1;i++)
for(int j=0;j<i;j++)
if(b[j]==b[i])
b[i]=-1;
for(int i=0;i<m-1;i++)
if(b[i]!=-1)
printf("%d ", b[i]);
}