题目描述
ZN 想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了 N 个 1 到 1000 之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助 ZN 完成 “去重” 与“排序”的工作。输入格式
输入数据有多组,每组测试数据有 2 行,第 1 行为 1 个正整数,表示所生成的随机数的个数:N
第 2 行有 N 个用空格隔开的正整数,为所产生的随机数。
输出格式
对于每组测试实例,输出 2 行,第 1 行为 1 个正整数 M,表示不相同的随机数的个数。第 2 行为 M 个用空格隔开的正整数,为从小到大排好序的不相同的随机数。样例输入
10
20 40 321 67 40 20 89 301 407 15
样例输出
8
15 20 40 67 89 301 321 407
此题由于数据范围都不大,所以方法较多。可以采用桶排序的方法;也可以先排序,再依次找重复的数字
这道题首先要求无重复,之后是排序,因此可以利用C++语言中的set关联容器是最方便的,因此第一种实现方式就是采用set关联容器。
第二种方式也是常用的方法,因为是要有序和唯一的,因此我们可以利用数组来实现,将生成的数看做数组的下角标,如果存在这个数就将数组中的这个元素置1,这样无论有多少个重复的数,该元素都是1,因此实现去重。
方法一:
#include <iostream> #include <set> using namespace std; int main() { int num=0; int value; while(cin>>num) { set<int> orgroup; for (int i = 0; i<num; i++) { cin >> value; orgroup.insert(value); } for (auto m=orgroup.begin();m!=orgroup.end();m++) { cout << *m << endl; } } return 0; }
方法二:
#include <iostream> using namespace std; int main() { int loop; while(cin>>loop) { int num[1001]={0}; for(int i=0;i<loop;i++) { int j; cin>>j; num[j]=1; } for(int i=0;i<=1001;i++) { if(num[i]==1) { cout<<i<<endl; } } } return 0; }
标签:ZN,排序,int,1107,num,随机数,orgroup
From: https://www.cnblogs.com/Edward-Jie/p/17299412.html