解题思路:
1.把输入的随机数进行排序;(这里用的是合并排序)实现如下,具体遇到大数据排序再讲,复制用就行。

void Mesort(int *A,int *B,int left,int right);
/*A[]为待排序数组,B[],用于存过度值,left赋值为0,right赋值为A[]最后一个元素下标即可;
排好序的结果自然就在A[]里面;*/
void Merge(int *A,int *B,int left,int middle,int right);
void copy(int *A,int *B,int left,int right);
void Mesort(int *A,int *B,int left,int right)
{
 if(left<right)
 {
 int i=(left+right)/2;
 Mesort(A,B,left,i);
 Mesort(A,B,i+1 ,right);
 Merge(A,B,left,i,right);
 copy(A,B,left,right);
 }
}
/*--------------------------------------------------------*/
void Merge(int *A,int *B,int left,int middle,int right)
{
int  i=left,j=middle+1,k=left;

while((i<=middle)&&(j<=right))
{
if(A[i]<=A[j])
B[k++]=A[i++];
else
B[k++]=A[j++];
}

if(i>middle)
for(int q=j;q<=right;q++)
 B[k++]=A[q];
else
for(int q=i;q<=middle;q++)
 B[k++]=A[q];

}
/*--------------------------------------------------------*/
void copy(int *A,int *B,int left,int right)
{
for(;left<=right;left++)
A[left]=B[left];
}

2.移除相同随机数即:把A[]中元素赋值到C[]里面,相同的元素不赋值;(移除前提排好序)

int yichu(int *A,int *C,int N)
{
      int n= N;  //n用于存放C[]中元素个数,输出结果使用
      C[0]=A[0];  //先把A[]第一个元素赋值
  for(int i=1,j=1;i<N;i++)   //A[],中元素下标从1开始,与前一个相同则不复制到C[];
    {
       if(A[i]==A[i-1])
                n--;   //遇到相同的随机数,减去1,不赋值
                else   //不相同则赋值到C[]里面
                {C[j]=A[i];j++;} //不相同则赋值到C[]里面,同时C[],元素下标加1
    }

return n;    //把n返回,用于输出
}



参考代码:

#include <stdio.h>
#include <malloc.h>
void function( int *A, int N );

int yichu( int *A, int *C, int N );

void input( int *A, int N );

void output( int *C, int N );

/*--------------------------------------------------*/
void Mesort( int *A, int *B, int left, int right );
void Merge( int *A, int *B, int left, int middle, int right );
void copy( int *A, int *B, int left, int right );


/*------------------------------------------------*/
int main()
{
    int    N;
    int    *A;

    while ( scanf( "%d", &N ) != EOF )
    {
        A = (int *) malloc( N * sizeof(int) );
        function( A, N );
    }
    return(0);
}


/*------------------------------------------------*/

void function( int *A, int N )
{
    int    *C    = (int *) malloc( N * sizeof(int) );  //C[]用于存移除相同元素后的随机数
    int    *B    = (int *) malloc( N * sizeof(int) );   //排序过程使用

    input( A, N );     //输入随机数
             Mesort( A, B, 0, N - 1 );   //排序
                   N = yichu( A, C, N );    //移除相同随机数,并把结果存于C[]
                             output( C, N );       //输出结果

    return;
}


/*------------------------------------------------*/
int yichu( int *A, int *C, int N )
{
    int n = N;
    C[0] = A[0];
    for ( int i = 1, j = 1; i < N; i++ )
    {
        if ( A[i] == A[i - 1] )
            n--;
               else{ C[j] = A[i]; j++; }
    }

    return(n);
}


/*------------------------------------------------*/
void output( int *C, int N )
{
    printf( "%d\n", N );     //输出元素个数,带换行符
       for ( int i = 0; i < N - 1; i++ )
            printf( "%d ", C[i] );     //输出前面N-1个元素,带空格
                printf( "%d\n", C[N - 1] );    //输出第N个元素,不带空格,加换行符
}


/*------------------------------------------------*/
void input( int *A, int N )
{
    for ( int i = 0; i < N; i++ )
        scanf( "%d", &A[i] );
}


/*==================================================================*/
void Mesort( int *A, int *B, int left, int right )    //合并排序函数
{
    if ( left < right )
    {
        int i = (left + right) / 2;
        Mesort( A, B, left, i );
        Mesort( A, B, i + 1, right );
        Merge( A, B, left, i, right );
        copy( A, B, left, right );
    }
}


/*--------------------------------------------------------*/
void Merge( int *A, int *B, int left, int middle, int right )
{
    int i = left, j = middle + 1, k = left;

    while ( (i <= middle) && (j <= right) )
    {
        if ( A[i] <= A[j] )
            B[k++] = A[i++];
        else
            B[k++] = A[j++];
    }

    if ( i > middle )
        for ( int q = j; q <= right; q++ )
            B[k++] = A[q];
    else
        for ( int q = i; q <= middle; q++ )
            B[k++] = A[q];
}


/*--------------------------------------------------------*/
void copy( int *A, int *B, int left, int right )
{
    for (; left <= right; left++ )
        A[left] = B[left];
}

别忘点赞哦-.-

点赞(19)
 

0.0分

8 人评分

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

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

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

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

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

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

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

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

评论列表 共有 0 条评论

暂无评论