鱼C论坛

 找回密码
 立即注册
查看: 1576|回复: 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语言的代码实现:


  1. #include <stdio.h>
  2. #define MAX_SIZE 100

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

  11. int main()
  12. {
  13.     int A[MAX_SIZE], B[MAX_SIZE];
  14.     int nA = 0, nB = 0;

  15.     /* 输入集合A */
  16.     scanf("%d", &A[nA]);
  17.     while (A[nA] != -1)
  18.     {
  19.         nA++;
  20.         scanf("%d", &A[nA]);
  21.     }

  22.     /* 输入集合B */
  23.     scanf("%d", &B[nB]);
  24.     while (B[nB] != -1)
  25.     {
  26.         nB++;
  27.         scanf("%d", &B[nB]);
  28.     }

  29.     /* 求A、B的差集 */
  30.     for (int i = 0; i < nA; i++)
  31.     {
  32.         for (int j = 0; j < nB; j++)
  33.         {
  34.             if (A[i] == B[j])
  35.             {
  36.                 delete(A, i, nA);   /* 删除A中的该元素 */
  37.                 nA--;              /* 数组长度减1 */
  38.                 i--;               /* 避免漏掉后面的元素 */
  39.                 break;             /* 找到该元素后退出内层循环 */
  40.             }
  41.         }
  42.     }

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

  51.     return 0;
  52. }
复制代码


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

使用道具 举报

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

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

以下是代码示例:

  1. #include <stdio.h>

  2. #define MAX_SIZE 100

  3. int main() {
  4.     int setA[MAX_SIZE], setB[MAX_SIZE], result[MAX_SIZE];
  5.     int i, j, k;
  6.     int flag;

  7.     // 读取集合 A 中的元素
  8.     i = 0;
  9.     while (1) {
  10.         scanf("%d", &setA[i]);
  11.         if (setA[i] == -1) {
  12.             break;
  13.         }
  14.         i++;
  15.     }

  16.     // 读取集合 B 中的元素
  17.     j = 0;
  18.     while (1) {
  19.         scanf("%d", &setB[j]);
  20.         if (setB[j] == -1) {
  21.             break;
  22.         }
  23.         j++;
  24.     }

  25.     // 计算差集
  26.     k = 0;
  27.     for (i = 0; i < j; i++) {
  28.         flag = 0;
  29.         for (j = 0; j < i; j++) {
  30.             if (setA[i] == setB[j]) {
  31.                 flag = 1;
  32.                 break;
  33.             }
  34.         }
  35.         if (flag == 0) {
  36.             result[k] = setA[i];
  37.             k++;
  38.         }
  39.     }

  40.     // 输出结果
  41.     if (k == 0) {
  42.         printf("集合 A、B 的差集为空集\n");
  43.     } else {
  44.         printf("集合 A、B 的差集为:");
  45.         for (i = 0; i < k; i++) {
  46.             printf("%d ", result[i]);
  47.         }
  48.         printf("\n");
  49.     }

  50.     return 0;
  51. }
复制代码


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

接下来,我们使用一个循环遍历集合 A 中的每个元素,对于每个元素,我们都检查它是否属于集合 B 中。如果不属于,则将其添加到结果数组中。最后,我们输出结果数组中的元素,如果结果数组为空,则输出空集。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

以下是C语言的代码实现:


  1. #include <stdio.h>
  2. #define MAX_SIZE 100

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

  11. int main()
  12. {
  13.     int A[MAX_SIZE], B[MAX_SIZE];
  14.     int nA = 0, nB = 0;

  15.     /* 输入集合A */
  16.     scanf("%d", &A[nA]);
  17.     while (A[nA] != -1)
  18.     {
  19.         nA++;
  20.         scanf("%d", &A[nA]);
  21.     }

  22.     /* 输入集合B */
  23.     scanf("%d", &B[nB]);
  24.     while (B[nB] != -1)
  25.     {
  26.         nB++;
  27.         scanf("%d", &B[nB]);
  28.     }

  29.     /* 求A、B的差集 */
  30.     for (int i = 0; i < nA; i++)
  31.     {
  32.         for (int j = 0; j < nB; j++)
  33.         {
  34.             if (A[i] == B[j])
  35.             {
  36.                 delete(A, i, nA);   /* 删除A中的该元素 */
  37.                 nA--;              /* 数组长度减1 */
  38.                 i--;               /* 避免漏掉后面的元素 */
  39.                 break;             /* 找到该元素后退出内层循环 */
  40.             }
  41.         }
  42.     }

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

  51.     return 0;
  52. }
复制代码


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

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-10 15:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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