原题链接:明明的随机数
解题思路:
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];
}别忘点赞哦-.-
0.0分
8 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复