用C语言实现“python的while循环——合并数列”

本人是一枚在校的计科大学生,这是我的第一篇文章。

从csdn上学习到了很多知识,也想这里分享学习中的一些心得,欢迎大佬指正,欢迎志同道合的小伙伴一起交流!

本人还没学懂C语言,但报了有C语言预修要求的课,这是一道作业题,自学了很多内容后才解决了这道题。但这种被虐完以后能力提升的感觉好爽!

【问题描述】从标准输入上读入2N行(行号从0开始)由空格分隔的整数,并顺序将第2i和2i+1行(0 <= i <= N)合并成一个由小到大排好序并删除重复数字的数列,写在标准输出上,每个数列一行。每一个原始数列不超过50个数字。
【输入形式】输入2N行整数,每行对应一个数列。每行有k个数字,是属于这一数列的所有整数,由空格分隔。这些整数随机排列,并可能含有重复数字。程序的任务就是将每两个相邻的数列合并成一个,并且从小到大排序,同时要删除重复数字。
【输出形式】输出有N行,每行有若干个空格分隔的整数,是在输入文件中对应两个输入行的合并结果。并且:
1.这些数字已经从小到大排序。
2.不含重复数字。
【样例输入】
18 29 30 27 26
20 30 5 29
76 80
99 233 87 35 24 9
27 234 27
65 70 39 87 35 24 100
【样例输出】
5 18 20 26 27 29 30
9 24 35 76 80 87 99 233
24 27 35 39 65 70 87 100 234
【样例说明】输入共有6行整数。第一个数列含5个整数,分别是18、29、30、27、26。依次类推,第二个数列含4个整数,第三个数列含2个整数,…,第六个数列含7个整数。输出共有三行数字。输出的第一行是将原输出的第一、二个数列合并,同时删除重复数字并从小到大排序的结果。输出的第二行是将原输出的第三、四个数列合并,同时删除重复数字并从小到大排序的结果。输出的第三行是将原输出的第五、六个数列合并,同时删除重复数字并从小到大排序的结果。
【运行时限】要求每次运行时间限制在10秒之内。超出时间则认为程序错误。
【评分标准】输出的数字中。如果你的程序计算的完全正确,该测试点得10分,否则算该测试点得分为0。
————————————————
(版权声明:本文为CSDN博主「weixin_43028509」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_43028509/article/details/84288939)

原作者用python解决,以下给出C语言做法:

#include <stdio.h>
#include <stdlib.h>
// 用于排序的比较函数
int compare(const void *a, const void *b) 
{
    return (*(int*)a - *(int*)b);
}
int main() 
{
    int N;
    printf("请输入N,以回车结束:");
    scanf("%d", &N);
    int size = 2 * N;
    int **sequences = (int **)malloc(size * sizeof(int *));
    // 读取输入的数字
    printf("输入2N行整数,以空格分隔:\n");
    int i;
    for (i = 0; i < size; i++) {
        sequences[i] = (int *)malloc(50 * sizeof(int));
        int j;
        for (j = 0; j < 50; j++) {
            if (scanf("%d", &sequences[i][j]) == EOF || getchar() == '\n') {
                break;
            }
        }
        // 记录实际长度
        sequences[i] = realloc(sequences[i], (j + 1) * sizeof(int));
        sequences[i][j+1] = 0; // 添加结束符
    }
    printf("输出:\n");
    // 合并并排序每两行的数字
    for (int i = 0; i < N; i++) {
        int *merged_sequence = (int *)malloc(100 * sizeof(int));
        int merged_size = 0;
        // 合并两行的数字
        for (int j = 0; sequences[2*i][j] != 0; j++) {
            merged_sequence[merged_size++] = sequences[2*i][j];
        }
        for (int j = 0; sequences[2*i+1][j] != 0; j++) {
            merged_sequence[merged_size++] = sequences[2*i+1][j];
        }
        // 排序合并后的数字
        qsort(merged_sequence, merged_size, sizeof(int), compare);
        // 删除重复数字
        int *unique_sequence = (int *)malloc(100 * sizeof(int));
        int unique_size = 0;
        unique_sequence[unique_size++] = merged_sequence[0];
        for (int j = 1; j < merged_size; j++) {
            if (merged_sequence[j] != merged_sequence[j-1])
                unique_sequence[unique_size++] = merged_sequence[j];
        }
        // 输出结果
        for (int j = 0; j < unique_size; j++) {
            printf("%d ", unique_sequence[j]);
        }
        printf("\n");
        free(merged_sequence);
        free(unique_sequence);
    }
    // 释放内存
    for (int i = 0; i < size; i++) {
        free(sequences[i]);
    }
    free(sequences);
    return 0;
}

期待伙伴们的各种建议呦!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值