解题思路:

                肯定是先排序再去重了!!!先使用快速排序法或者冒泡排序法进行排序,排序没有什么难度,如果不懂排序的可以看看我之前写的排序法(带模板的啊)。

            去重(C++):C++的去重和C有点不一样,因为C++有个函数可以去重(把重复的元素放到末尾),unique(a,b),参数是为去重前的首地址和尾地址,返回值为去重后的尾地址。利用这个函数可以快速方便的解决问题。

            去重(C):C语言版本的就比较麻烦了,利用多个for循环,来解决。排序后的数组,使用一个for循环来统计不重复的数个数,再使用一个for循环来输出不重复的数字,没有C++的方便

            题解不易,帮忙点个评分,支持一下。也希望各位大佬指点!!!
注意事项:
                不要忘记数组的知识点,数组名可以表示首元素地址,数组名+数字 表示第n个数字的地址,数组元素地址 减(-) 数组元素地址,为这两个元素之间的元素总数(包括它们本身)。
参考代码:

C++代码

#include <iostream>
#include <algorithm>
using namespace std;

const int N = 100;
int nums[N];

void quick_sort(int nums[],int l,int r)
{
    if(l >= r)
        return;
    int i = l - 1,j = r + 1,x = nums[(l + r) / 2];
    while(i < j)
    {
        do i++;while(nums[i] < x);
        do j--;while(nums[j] > x);
        if(i < j)
        {
            int t = nums[i];
            nums[i] = nums[j];
            nums[j] = t;
        }
    }
    quick_sort(nums,l,j);
    quick_sort(nums,j + 1,r);
}

int main()
{
    int n;
    cin >> n;
    for(int i = 0;i < n;i++)
        cin >> nums[i];
    quick_sort(nums,0,n - 1);//快排
    n = unique(nums,nums + n) - nums;//去重函数,只是把重复的元素放后面,本来返回值是末尾元素的地址,然后减去首元素地址为数组长度
    cout << n << endl;
    for(int i = 0;i < n;i++)
        cout << nums[i] << ' ';
    return 0;
}

C语言代码

#include <stdio.h>
void bubble_sort(int nums[],int len)
{
    int i,j,temp;
    for(i = 0;i < len - 1;i++)//不循环到最后一个数字,是因为倒数第二个元素就能与它进行互换(不互换)操作
    {
        for(j = 0;j < len - 1 - i;j++)//这里写成len - 1 - i,是因为经过前面的循环,后面的i个元素已经排序完成了
        {
            if(nums[j] > nums[j + 1])//前面的数字比后面的数大时,就进行互换
            {
                temp = nums[j];
                nums[j] = nums[j + 1];
                nums[j + 1] = temp;
            }
        }
    }
}
/*
void quick_sort(int nums[],int l,int r)//快速排序法
{
    if(l >= r)
        return;
    int i = l - 1,j = r + 1,x= nums[(l + r) / 2];
    while(i < j)
    {
        do i++;while(nums[i] < x);
        do j--;while(nums[j] > x);
        if(i < j)
        {
            int t = nums[i];
            nums[i] = nums[j];
            nums[j] = t;
        }
    }
    quick_sort(nums,l,j);
    quick_sort(nums,j + 1,r);
}

*/
int main()
{
    int N;
    scanf("%d",&N);
    int i,nums[N];
    for(i = 0;i < N;i++)
    {
        scanf("%d",&nums[i]);//把N个数字存入数组
    }
    bubble_sort(nums,N);//再来一个快速排序法 quick_sort(nums,0,n - 1);
    int new_len = N;//用来计算不重复数字
    for(i = 0;i < N;i++ )
    {
        if(nums[i] == nums[i + 1])
            new_len -= 1;//如果有相同数字,就减1
    }
    printf("%d\n",new_len);
    for(i = 0;i < N;i++ )
    {
        if(nums[i] != nums[i + 1])//如果前面的元素与后面的元素不相同就打印
            printf("%d ",nums[i]);
    }
    return 0;
}


点赞(0)
 

0.0分

0 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论