鱼C论坛

 找回密码
 立即注册
查看: 1035|回复: 2

[已解决]c语言求助

[复制链接]
发表于 2023-5-8 17:30:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
【问题描述】

两个集合的差集定义如下:
集合A、B的差集,由所有属于A但不属于B的元素构成。
输入两个集合A、B,每个集合中元素都是自然数。求集合A、B的差集。
【输入形式】
从标准输入接收集合中的自然数元素,以空格分隔。-1表示输入结束。
其中,每个集合都不输入重复的元素。
【输出形式】
输出差运算后集合中的元素,以空格分隔。输出元素的顺序与原有集合A输入的顺序一致。
如果A、B的差集为空集,则不输出任何数值。
【样例输入】

2 8 3 4 -1
6 1 4 9 -1
【样例输出】

2 8 3
【样例说明】从标准输入接收集合中的自然数元素,输出集合A、B的差集。
最佳答案
2023-5-8 17:51:17
这道题让我们求两个集合的差集,我们可以使用数组来存储集合元素,并通过循环遍历比较两个集合中的元素是否相等,若存在,则把该元素从第一个集合中删除。最后输出第一个集合中剩余的元素即可。

以下是C语言的代码实现:
#include <stdio.h>
#define MAX_SIZE 100

/* 删除数组a中第i个位置上的元素 */
void delete(int a[], int i, int len)
{
    for (int j = i; j < len - 1; j++)
    {
        a[j] = a[j + 1];
    }
}

int main()
{
    int A[MAX_SIZE], B[MAX_SIZE];
    int nA = 0, nB = 0;

    /* 输入集合A */
    scanf("%d", &A[nA]);
    while (A[nA] != -1)
    {
        nA++;
        scanf("%d", &A[nA]);
    }

    /* 输入集合B */
    scanf("%d", &B[nB]);
    while (B[nB] != -1)
    {
        nB++;
        scanf("%d", &B[nB]);
    }

    /* 求A、B的差集 */
    for (int i = 0; i < nA; i++)
    {
        for (int j = 0; j < nB; j++)
        {
            if (A[i] == B[j])
            {
                delete(A, i, nA);   /* 删除A中的该元素 */
                nA--;              /* 数组长度减1 */
                i--;               /* 避免漏掉后面的元素 */
                break;             /* 找到该元素后退出内层循环 */
            }
        }
    }

    if (nA != 0)   /* 差集不为空集,输出结果 */
    {
        for (int i = 0; i < nA; i++)
        {
            printf("%d ", A[i]);
        }
        printf("\n");
    }

    return 0;
}

需要注意的一点是在删除元素后,循环遍历的索引需要减1,以免跳过后面的元素。在此代码中,在执行删除操作后,将i--来重新指向当前位置,以便处理下一个元素。
有用请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-8 17:31:02 | 显示全部楼层
这个问题可以使用 C 语言中的数组和循环来实现。

首先,我们需要定义两个数组来存储集合 A 和集合 B 中的元素,然后我们可以使用循环来遍历集合 A 中的每个元素,检查它是否属于集合 B,如果不属于,则将其添加到结果数组中。

以下是代码示例:
#include <stdio.h>

#define MAX_SIZE 100

int main() {
    int setA[MAX_SIZE], setB[MAX_SIZE], result[MAX_SIZE];
    int i, j, k;
    int flag;

    // 读取集合 A 中的元素
    i = 0;
    while (1) {
        scanf("%d", &setA[i]);
        if (setA[i] == -1) {
            break;
        }
        i++;
    }

    // 读取集合 B 中的元素
    j = 0;
    while (1) {
        scanf("%d", &setB[j]);
        if (setB[j] == -1) {
            break;
        }
        j++;
    }

    // 计算差集
    k = 0;
    for (i = 0; i < j; i++) {
        flag = 0;
        for (j = 0; j < i; j++) {
            if (setA[i] == setB[j]) {
                flag = 1;
                break;
            }
        }
        if (flag == 0) {
            result[k] = setA[i];
            k++;
        }
    }

    // 输出结果
    if (k == 0) {
        printf("集合 A、B 的差集为空集\n");
    } else {
        printf("集合 A、B 的差集为:");
        for (i = 0; i < k; i++) {
            printf("%d ", result[i]);
        }
        printf("\n");
    }

    return 0;
}

在上面的代码中,我们首先定义了三个数组  setA 、 setB  和  result ,分别用于存储集合 A、B 和结果。然后我们使用两个循环分别读取集合 A 和集合 B 中的元素,直到遇到 -1 为止。

接下来,我们使用一个循环遍历集合 A 中的每个元素,对于每个元素,我们都检查它是否属于集合 B 中。如果不属于,则将其添加到结果数组中。最后,我们输出结果数组中的元素,如果结果数组为空,则输出空集。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-8 17:51:17 | 显示全部楼层    本楼为最佳答案   
这道题让我们求两个集合的差集,我们可以使用数组来存储集合元素,并通过循环遍历比较两个集合中的元素是否相等,若存在,则把该元素从第一个集合中删除。最后输出第一个集合中剩余的元素即可。

以下是C语言的代码实现:
#include <stdio.h>
#define MAX_SIZE 100

/* 删除数组a中第i个位置上的元素 */
void delete(int a[], int i, int len)
{
    for (int j = i; j < len - 1; j++)
    {
        a[j] = a[j + 1];
    }
}

int main()
{
    int A[MAX_SIZE], B[MAX_SIZE];
    int nA = 0, nB = 0;

    /* 输入集合A */
    scanf("%d", &A[nA]);
    while (A[nA] != -1)
    {
        nA++;
        scanf("%d", &A[nA]);
    }

    /* 输入集合B */
    scanf("%d", &B[nB]);
    while (B[nB] != -1)
    {
        nB++;
        scanf("%d", &B[nB]);
    }

    /* 求A、B的差集 */
    for (int i = 0; i < nA; i++)
    {
        for (int j = 0; j < nB; j++)
        {
            if (A[i] == B[j])
            {
                delete(A, i, nA);   /* 删除A中的该元素 */
                nA--;              /* 数组长度减1 */
                i--;               /* 避免漏掉后面的元素 */
                break;             /* 找到该元素后退出内层循环 */
            }
        }
    }

    if (nA != 0)   /* 差集不为空集,输出结果 */
    {
        for (int i = 0; i < nA; i++)
        {
            printf("%d ", A[i]);
        }
        printf("\n");
    }

    return 0;
}

需要注意的一点是在删除元素后,循环遍历的索引需要减1,以免跳过后面的元素。在此代码中,在执行删除操作后,将i--来重新指向当前位置,以便处理下一个元素。
有用请设置最佳答案
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-28 01:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表