鱼C论坛

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

[已解决]小白求助

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

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

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

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]){
                                combined[j] = 0;
                                for (int k = j;k < count-1;k++){
                                        combined[k] = combined[k+1];
                                }
                                count--;
                        }
                }
        }
       
        for (i = 0;i < count-1;i++){//排序
                if (combined[i] == 0)        continue;
                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:25:33
你的代码中有一个错误导致输出中出现了重复的数字。在去掉相同元素的循环中,当发现两个相同的元素时,你将后面的元素向前移动了一位,但没有正确更新循环变量j的值,导致下一次循环会跳过一个元素。

为了解决这个问题,可以在找到相同元素后,将后面的元素向前移动一位后,将循环变量j减1,这样下一次循环时j的值会正确地指向被移动的元素。

以下是修改后的代码:
#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])            {                combined[j] = 0;                for (int k = j; k < count - 1; k++)                {                    combined[k] = combined[k + 1];                }                count--;                j--; // 修正循环变量j的值            }        }    }    for (i = 0; i < count - 1; i++)    { //排序        if (combined[i] == 0)            continue;        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,7,9,12,17,22
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-11-16 17:25:33 | 显示全部楼层    本楼为最佳答案   
你的代码中有一个错误导致输出中出现了重复的数字。在去掉相同元素的循环中,当发现两个相同的元素时,你将后面的元素向前移动了一位,但没有正确更新循环变量j的值,导致下一次循环会跳过一个元素。

为了解决这个问题,可以在找到相同元素后,将后面的元素向前移动一位后,将循环变量j减1,这样下一次循环时j的值会正确地指向被移动的元素。

以下是修改后的代码:
#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])            {                combined[j] = 0;                for (int k = j; k < count - 1; k++)                {                    combined[k] = combined[k + 1];                }                count--;                j--; // 修正循环变量j的值            }        }    }    for (i = 0; i < count - 1; i++)    { //排序        if (combined[i] == 0)            continue;        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,7,9,12,17,22
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-11-16 17:28:06 | 显示全部楼层
你的代码在去重的过程中出现了问题,导致最后输出中出现了重复的数字。你可以使用一个集合(Set)来存储合并后的整数,然后遍历集合来输出结果。这样可以确保去重并且不会改变原有顺序。

下面是你可以采用的修改方案:
#include <stdio.h>
#include <stdbool.h>

int main(void) {
    int line1[40], line2[40];
    int count1 = 0, count2 = 0;

    // 读取第一行整数
    char ch = ',';
    while (ch == ',' && scanf("%d", &line1[count1])) {
        ch = getchar();
        count1++;
    }

    // 读取第二行整数
    ch = ',';
    while (ch == ',' && scanf("%d", &line2[count2])) {
        ch = getchar();
        count2++;
    }

    // 合并两行整数
    int combined[80];
    for (int i = 0; i < count1; i++) {
        combined[ i] = line1[ i];
    }
    for (int i = 0; i < count2; i++) {
        combined[i + count1] = line2[ i];
    }

    // 使用集合来去重
    bool exists[100] = {false};  // 标记整数是否存在
    int result[80];
    int resultCount = 0;
    for (int i = 0; i < count1 + count2; i++) {
        if (!exists[combined[ i]]) {
            exists[combined[ i]] = true;
            result[resultCount] = combined[ i];
            resultCount++;
        }
    }

    // 对结果进行排序
    for (int i = 0; i < resultCount - 1; i++) {
        for (int j = 0; j < resultCount - 1 - i; j++) {
            if (result[j] > result[j + 1]) {
                int temp = result[j];
                result[j] = result[j + 1];
                result[j + 1] = temp;
            }
        }
    }

    // 输出结果
    for (int i = 0; i < resultCount; i++) {
        printf(i == 0 ? "%d" : ",%d", result[ i]);
    }

    return 0;
}

这样修改后,你的程序就可以正确地合并两行整数,去重并按从小到大顺序输出结果了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-2-3 07:12

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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