问题 : 筛排处理 明明的随机数
时间限制: 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;
}