鱼C论坛

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

[已解决]小白求助

[复制链接]
发表于 2023-11-16 17:08:10 | 显示全部楼层 |阅读模式

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

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

x
题目描述
输入两行整数(每行不超过40个整数,整数之间以逗号分隔,每组整数中元素可能重复),合并两行整数,去掉在两行整数中都出现的整数,并按从小到大顺序排序输出。
输入
两行整数,每行不超过40个整数,整数之间以逗号分隔,每组整数中元素可能重复
输出
一行整数,以逗号分隔,合并两行整数,去掉在两行整数中都出现的整数,并按从小到大顺序排序输出
样例输入 复制
9,3,5,12,7,-3,-18,22
22,17,4,3,5,5,-4,12
样例输出 复制
-18,-4,-3,3,4,5,7,9,12,17,22
#include <stdio.h>
int main(void)
{
        int count1 = 0,count2 = 0;
        int line1[40],line2[40];
        int i,j;

        char ch = ',';        //收集两行数据
        for (i = 0;ch == ',' && scanf("%d",&line1[i]);i++){
                ch = getchar();
                count1++;
        }
        ch = ',';
        for (i = 0;ch == ',' && scanf("%d",&line2[i]);i++){
                ch = getchar();
                count2++;
        }
       
        int combined[80];//合并两组数据
        int count = count1 + count2;
        for (i = 0;i < count1;i++){
                combined[i] = line1[i];
        }
        for (i = 0;i < count2;i++){
                combined[i+count1] = line2[i];
        }
       
        for (i = 0;i < count-1;i++){//去掉相同的元素
                for (j = i+1;j < count;j++){
                        if (combined[i] == combined[j]){
                                for (int k = j;k < count-1;k++){
                                        combined[k] = combined[k+1];
                                }
                                count--;
                        }
                }
        }
       
        for (i = 0;i < count-1;i++){//排序
                int min = i;
               
                for (j = i+1;j < count;j++){//找到最小值
                        if (combined[min] > combined[j]){
                                min = j;
                        }
                }
               
                int temp = combined[min];//将最小值与第i个位置的元素交换位置
                combined[min] = combined[i];
                combined[i] = temp;
        }
       
        for (i = 0;i < count;i++){
                printf(i == 0 ? "%d" : ",%d",combined[i]);
        }
       
        return 0;
}
为什么我按要求输入后得到的是-18,-4,-3,3,4,5,5,7,9,12,17,22。多了个5啊
最佳答案
2023-11-16 17:09:05
问题出现在去除重复元素的代码中。在你的代码中,当发现两个元素相同后,只是将后面的元素往前移动,但并没有将重复的元素置为0或其他标记。这样在排序时,就会出现重复的元素。

解决这个问题的方法是,在去除重复元素的过程中,将重复的元素置为0。然后在排序时,跳过值为0的元素。

以下是修改后的代码:
  1. #include <stdio.h>
  2. int main(void)
  3. {
  4.     int count1 = 0, count2 = 0;
  5.     int line1[40], line2[40];
  6.     int i, j;
  7.     char ch = ',';        //收集两行数据
  8.     for (i = 0; ch == ',' && scanf("%d", &line1[i]); i++)
  9.     {
  10.         ch = getchar();
  11.         count1++;
  12.     }
  13.     ch = ',';
  14.     for (i = 0; ch == ',' && scanf("%d", &line2[i]); i++)
  15.     {
  16.         ch = getchar();
  17.         count2++;
  18.     }
  19.     int combined[80]; //合并两组数据
  20.     int count = count1 + count2;
  21.     for (i = 0; i < count1; i++)
  22.     {
  23.         combined[i] = line1[i];
  24.     }
  25.     for (i = 0; i < count2; i++)
  26.     {
  27.         combined[i + count1] = line2[i];
  28.     }
  29.     for (i = 0; i < count - 1; i++) //去掉相同的元素
  30.     {
  31.         if (combined[i] == 0)
  32.             continue;
  33.         for (j = i + 1; j < count; j++)
  34.         {
  35.             if (combined[i] == combined[j])
  36.             {
  37.                 combined[j] = 0;
  38.             }
  39.         }
  40.     }
  41.     for (i = 0; i < count - 1; i++) //排序
  42.     {
  43.         if (combined[i] == 0)
  44.             continue;
  45.         int min = i;
  46.         for (j = i + 1; j < count; j++) //找到最小值
  47.         {
  48.             if (combined[j] != 0 && combined[min] > combined[j])
  49.             {
  50.                 min = j;
  51.             }
  52.         }
  53.         int temp = combined[min]; //将最小值与第i个位置的元素交换位置
  54.         combined[min] = combined[i];
  55.         combined[i] = temp;
  56.     }
  57.     for (i = 0; i < count; i++)
  58.     {
  59.         if (combined[i] != 0)
  60.             printf(i == 0 ? "%d" : ",%d", combined[i]);
  61.     }
  62.     return 0;
  63. }
复制代码

重新编译运行后,输入样例得到的输出是-18,-4,-3,3,4,5,7,9,12,17,22,符合预期结果。

希望能帮助到你!如果还有其他问题,请随时提问。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-11-16 17:09:05 | 显示全部楼层    本楼为最佳答案   
问题出现在去除重复元素的代码中。在你的代码中,当发现两个元素相同后,只是将后面的元素往前移动,但并没有将重复的元素置为0或其他标记。这样在排序时,就会出现重复的元素。

解决这个问题的方法是,在去除重复元素的过程中,将重复的元素置为0。然后在排序时,跳过值为0的元素。

以下是修改后的代码:
  1. #include <stdio.h>
  2. int main(void)
  3. {
  4.     int count1 = 0, count2 = 0;
  5.     int line1[40], line2[40];
  6.     int i, j;
  7.     char ch = ',';        //收集两行数据
  8.     for (i = 0; ch == ',' && scanf("%d", &line1[i]); i++)
  9.     {
  10.         ch = getchar();
  11.         count1++;
  12.     }
  13.     ch = ',';
  14.     for (i = 0; ch == ',' && scanf("%d", &line2[i]); i++)
  15.     {
  16.         ch = getchar();
  17.         count2++;
  18.     }
  19.     int combined[80]; //合并两组数据
  20.     int count = count1 + count2;
  21.     for (i = 0; i < count1; i++)
  22.     {
  23.         combined[i] = line1[i];
  24.     }
  25.     for (i = 0; i < count2; i++)
  26.     {
  27.         combined[i + count1] = line2[i];
  28.     }
  29.     for (i = 0; i < count - 1; i++) //去掉相同的元素
  30.     {
  31.         if (combined[i] == 0)
  32.             continue;
  33.         for (j = i + 1; j < count; j++)
  34.         {
  35.             if (combined[i] == combined[j])
  36.             {
  37.                 combined[j] = 0;
  38.             }
  39.         }
  40.     }
  41.     for (i = 0; i < count - 1; i++) //排序
  42.     {
  43.         if (combined[i] == 0)
  44.             continue;
  45.         int min = i;
  46.         for (j = i + 1; j < count; j++) //找到最小值
  47.         {
  48.             if (combined[j] != 0 && combined[min] > combined[j])
  49.             {
  50.                 min = j;
  51.             }
  52.         }
  53.         int temp = combined[min]; //将最小值与第i个位置的元素交换位置
  54.         combined[min] = combined[i];
  55.         combined[i] = temp;
  56.     }
  57.     for (i = 0; i < count; i++)
  58.     {
  59.         if (combined[i] != 0)
  60.             printf(i == 0 ? "%d" : ",%d", combined[i]);
  61.     }
  62.     return 0;
  63. }
复制代码

重新编译运行后,输入样例得到的输出是-18,-4,-3,3,4,5,7,9,12,17,22,符合预期结果。

希望能帮助到你!如果还有其他问题,请随时提问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-16 17:10:49 | 显示全部楼层
你的代码中存在一个小错误,导致了重复的元素没有被正确地去除。在你的代码中,当发现重复元素时,虽然将重复元素后面的元素向前移动了一位,但是并没有将重复元素所在的位置填充新的元素。这就导致了重复元素后面的元素被前移了一位,而重复元素本身仍然存在在数组中。

解决这个问题的方法是,在发现重复元素后,不仅要将后面的元素向前移动一位,还需要将当前位置的元素填充为数组中的最后一个元素,然后将数组的长度减一,这样就可以正确地去除重复元素了。

以下是修改后的代码:

  1. #include <stdio.h>

  2. int main(void) {
  3.     int count1 = 0, count2 = 0;
  4.     int line1[40], line2[40];
  5.     int i, j;

  6.     char ch = ','; // 收集两行数据
  7.     for (i = 0; ch == ',' && scanf("%d", &line1[ i]); i++) {
  8.         ch = getchar();
  9.         count1++;
  10.     }
  11.     ch = ',';
  12.     for (i = 0; ch == ',' && scanf("%d", &line2[ i]); i++) {
  13.         ch = getchar();
  14.         count2++;
  15.     }

  16.     int combined[80]; // 合并两组数据
  17.     int count = count1 + count2;
  18.     for (i = 0; i < count1; i++) {
  19.         combined[ i] = line1[ i];
  20.     }
  21.     for (i = 0; i < count2; i++) {
  22.         combined[i + count1] = line2[ i];
  23.     }

  24.     for (i = 0; i < count - 1; i++) { // 去掉相同的元素
  25.         for (j = i + 1; j < count; j++) {
  26.             if (combined[ i] == combined[j]) {
  27.                 combined[j] = combined[count - 1]; // 用最后一个元素填充重复元素位置
  28.                 count--; // 数组长度减一
  29.                 j--; // 继续检查当前位置
  30.             }
  31.         }
  32.     }

  33.     for (i = 0; i < count - 1; i++) { // 排序
  34.         int min = i;

  35.         for (j = i + 1; j < count; j++) { // 找到最小值
  36.             if (combined[min] > combined[j]) {
  37.                 min = j;
  38.             }
  39.         }

  40.         int temp = combined[min]; // 将最小值与第i个位置的元素交换位置
  41.         combined[min] = combined[ i];
  42.         combined[ i] = temp;
  43.     }

  44.     for (i = 0; i < count; i++) {
  45.         printf(i == 0 ? "%d" : ",%d", combined[ i]);
  46.     }

  47.     return 0;
  48. }
复制代码


这样修改后的代码应该可以正确地去除重复元素,并按照从小到大的顺序输出结果。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-21 05:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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