NOIP复赛上机试题明明的随机数(算法和原码参考)



问题描述-明明的随机数】明明想在学校中请一些同学一起做问卷调查,为了实验的客观性,他先用计算机生成了N 个1 到1000 之间的随机整数,(N≤100),对于其中重复的数字,只保留一个,把其余相

同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好

的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。

【输入文件】

输入文件random.in 有2 行,第1 行为1 个正整数,表示所生成的随机数的个数:N

第二行有N 个用空格隔开的正整数,为所产生的随机数。

【输出文件】

输出文件random.out 也是2 行,第1 行为1 个正整数M,表示不相同的随机数的个数。

第2 行为M 个用空格隔开的正整数,为从小到大排好序的不相同的随机数。

【输入样例】

10

20 40 32 67 40 20 89 300 400 15

【输出样例】

8


15 20 32 40 67 89 300 400


 

/*本题主要是考察对排序算法的掌握,只不过外加了一个去重的操作。本题的算法有很多,我们在考试时,时间紧,题目难度大。如果我们能用最简单的思维方式解决问题的话,就不一定把很多的时间放在代码执行效率的优化问题上。有时候牺牲一点空间(内存)和时间对于获取更多的考试时间是非常有必要的。本题最简单的思想方法,就是根据题目要求,先对给定的一组数据进行排序,排序的方法可以使用最简单的冒泡算法来完成。由于本题的输出结果要求我们必须先统计出不重复数据的个数,所以当数据排序之后,我们可以先对所有的数据遍历一次,这一次遍历的目的就是让我们统计出不重复数据的个数,并将其输出。最后,我们还需进行一次遍历,这次遍历用于打印出排序之后不重复的所有数据结果.
*/

#include <stdio.h>
int main()
{
FILE *fp1,*fp2;
int N,M=0;
int i,j;
int a;
int num[100]; //根据题目所给的数据规模定义数组的大小
    if((fp1=fopen(“random.in”,”r”))==NULL)
{
printf(“cannot open file\n”);
return 0;
}

fscanf(fp1,”%d”,&N); //输入随机数的个数
for(i=0;i<N;i++)
fscanf(fp1,”%d”,&num[i]); //将已知的随机数存放到初始数组中

for(i=0;i<N;i++) //第一步:对所有数据进行排序(冒泡排序)
for(j=i+1;j<N;j++)
{
if(num[i]>num[j])
{
a=num[i];
num[i]=num[j];
num[j]=a;
}
}

fp2=fopen(“random.out”,”w”); //打开写文件的指针

for(i=0;i<N;i++) //第二步:本次遍历主要是统计出不重复数据的个数
{
if(i>0&&num[i]==num[i-1]) //思考一下这个去重的操作中为什么有i>0这个条件
          continue;
M++;
}

fprintf(fp2,”%d\n”,M); //在结果文件中打印出不重复数据的个数 并键入一个回车符

for(i=0;i<N;i++) //第三步:本次遍历是将不重复的数据打印到结果文件中
      {
if(i>0&&num[i]==num[i-1]) //思考一下这个去重的操作中为什么有i>0这个条件
continue;
fprintf(fp2,”%d “,num[i]);
}
fclose(fp1);
fclose(fp2);
return 0;

}

http://www.gzkg.net/show.aspx?id=117&cid=356

c++明明随机数解答的简单方法二:

#include<cstdio>
using namespace std;
int a[101],i,j,n,m;
int main()
{
scanf(“%d”,&n);
for(i=1;i<=n;++i)
scanf(“%d”,&a[i]);
for(i=1;i<=n-1;++i)
for(j=i;j<=n;++j)
if (a[i]>a[j])
{
int t=a[i];
a[i]=a[j];
a[j]=t;
}
m=1;
for(i=2;i<=n;++i)
if (a[i]>a[i-1]) ++m;
printf(“%d\n”,m);
printf(“%d”,a[1]);
for(i=2;i<=n;++i)
if (a[i]>a[i-1])
printf(” %d”,a[i]);
}