皆さん、こんにちは。近日,小白在做题的时候遇到了求不重复数的问题,今天在这里和大家分享并记录自己的方法。
首先,我们需要输入这两个集合,并且把它们并入一个数组里,这里我选择用一个数组接龙式输入
for (i = 0; i < n; i++)
scanf("%d", a+i);
scanf("%d", &m);
for (; i < m+n; i++)
scanf("%d", a+i);
然后,我们需要找到重复的数,并且标记它的位置,由于题目比较简单,加上重复的数不需要再显示,所以我选择用0将其覆盖当作标记(题目中集合里的元素(大于0小于100)),判断时注意排除元素本身,不然所有元素都会变成0。
最后,我选择每遍历一遍,输出一个元素,如果这个元素是0,那么便不再输出(说明之前已经输出过一样的数了)
这是第一种方法
for (i = 0; i < m + n; i++)
{
for (j = 0; j < m + n; j++)
{
if (a[i] == a[j] && i != j)
a[j] = 0;
}
if(a[i]!=0)
printf("%d ", a[i]);
}
这是完整代码
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n, m,a[100]={0};
int i,j,b[100]={0};
scanf("%d", &n);
for (i = 0; i < n; i++)
scanf("%d", a+i);
scanf("%d", &m);
for (; i < m+n; i++)
scanf("%d", a+i);
for (i = 0; i < m + n; i++)
{
for (j = 0; j < m + n; j++)
{
if (a[i] == a[j] && i != j)
a[j] = 0;
}
if(a[i]!=0)
printf("%d ", a[i]);
}
return 0;
}
下面是第二种(第一种的优化)
第一步一样,不再赘述。在第二步的时候,考虑到同一个集合里不会出现相同的元素这一特点,我将遍历的范围从两个集合之和缩小到了其中一个集合(第一种里忘了集合的特性了)
for (int i = 0; i < n; i++)
{
for (int j = n; j < m + n; j++)
if (a[j] == a[i])
{
a[j] = a[j + 1];
a[j + 1] = 0;
}
}
第二步,我选择遍历第一个集合里的所有元素,在第一层循环里嵌套一个循环用来遍历第二个集合里的全部元素,这样就可以找第二个集合里有没有和第一个集合相同的元素了,当程序发现了相同元素时,就会将位于第二个集合的重复元素的后面的内个元素覆盖到重复元素上,并将后面的元素赋值为0,善后工作做好之后就可以进行输出了,这里我又进行了一下排序,让输出看起来好看一些。
for (i = 0; i < m + n - 1; i++)
{
for (j = 0; j < m + n - i - 1; j++)
if (a[j] > a[j + 1])
{
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
这是完整的程序:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n, m, i, j, t, a[100] = { 0 };
scanf("%d", &n);
for (i = 0; i < n; i++)
scanf("%d", a + i);
scanf("%d", &m);
for (; i < m + n; i++)
scanf("%d", a + i);
for (i = 0; i < n; i++)
{
for (j = n; j < m + n; j++)
if (a[j] == a[i])
{
a[j] = a[j + 1];
a[j + 1] = 0;
}
}
for (i = 0; i < m + n - 1; i++)
{
for (j = 0; j < m + n - i - 1; j++)
if (a[j] > a[j + 1])
{
t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
for (i = 0; i < m + n; i++)
if (a[i] != 0)
printf("%d ", a[i]);
return 0;
}
-
間違いがあったら指摘してください、みんなで頑張りましょう(有错误欢迎指出,大家一起加油)