筛排处理 明明的随机数(C语言描述)

本文介绍了一种处理随机数的算法,通过去重和排序,实现对学校同学的问卷调查选择。文章提供了两种方法的代码实现,一种是先排序后去重,另一种是先去重再排序,后者采取边输入边剔除的方式,最后输出排好序的不重复随机数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题 : 筛排处理 明明的随机数

时间限制: 1Sec 内存限制: 128MB

题目描述

明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N<=100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作

输入

每组输入数据的第一行含有一个正整数N,表示后面行中有N个随机整数。若N=0,表示处理结束。

输出

对应每组输入数据,输出一组数据,该数据由单独一行开头,内含一个N,表示后面有N个排好序的整数,整数之间空一格。每组输出数据之间空一行。

样例输入

12
2 4 6 17 20 40 43 45 60 64 85 98
17
35 75 40 61 56 21 85 61 50 83 52 22 44 68 51 80 38
0

样例输出

12
2 4 6 17 20 40 43 45 60 64 85 98

16
21 22 35 38 40 44 50 51 52 56 61 68 75 80 83 85

思路:

根据题目描述,无非就是将数据进行筛选剔除重新排序
第一种:先进行排序,再将相同的数逐个剔除
第二种:先筛选剔除再进行重排
我用的是第二种,同时是采取边输入边剔除的方式。

代码:

#include<stdio.h>
int main() 
{
	int n,i,j,t,index=0,count=0;	//index为0则表示无重复,不需要剔除,count用于计数
	int a[105];
	scanf("%d",&n);
	while(n!=0)
	{
		for(i=0;i<n;i++)
		{
			scanf("%d",&t);
			if(i==0)a[i]=t;
			else 
			{
				j=i-count;	//i-count接下来要储存的数数组下标
				while(j>0)
				{
					if(t==a[--j]){index=1;break;}
				}
				if(index==0)a[i-count]=t;
				else index=0,count++;	//count记录下多少个不用储存的t
			}
		}
		for(i=0;i<n-count;i++)	//n-count表示筛选后剩下的数
			for(j=i+1;j<n-count;j++)
				if(a[i]>a[j])t=a[i],a[i]=a[j],a[j]=t;
		/*********输出部分************************/
		printf("%d\n",n-count);
		for(i=0;i<n-count;i++)
		{
			if(i!=n-count-1)printf("%d ",a[i]);
			else printf("%d\n",a[i]);
		}
		printf("\n");

		count=0;	//重新初始化count
		scanf("%d",&n);
	}

return 0;
} 

这是以第一种方法写的代码
注意 这是当输入数据只有一组的情况

#include<stdio.h>
int main() 
{
	int a[100];
	int b[100];
	int n,i,j,t;
	scanf("%d",&n);
	for(i=0;i<n;i++)
		scanf("%d",&a[i]);
	for(i=0;i<n;i++)
		for(j=i+1;j<n;j++)
			if(a[i]>a[j])t=a[i],a[i]=a[j],a[j]=t;
	for(i=0,j=0;i<n;i++)
	{
		
		if(i==n-1){b[j++]=a[i];break;}
		if(a[i]!=a[i+1])b[j++]=a[i];
	}
	printf("%d\n",j);
	for(i=0;i<j;i++)
		printf("%d ",b[i]);

return 0;
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值