题目描述
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了 N 个 1 到 1000 之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。
输入描述
有 2 行,第 1 行为 1 个正整数 N,表示所生成的随机数的个数:
第 2行有 N 个用空格隔开的正整数,为所产生的随机数。
输出描述
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
代码及思路
/*
1.先输入随机数的个数,然后输入数据
2.去重:循环数组num(一层循环),依次让temp指向数组中每一个数据,
temp在指向数组num中的值时,要循环temp所指向的
下标之后的数据(二层循环),如果temp和后面的数据有相等的话
就将后面的数据置为-1.二层循环结束后,若temp不是-1的话,就将temp的值
赋给数组tempNum,同时记录tempNum的下标. (这里不能用下标i,因为i下标对应的值
可能是-1,新的数组的个数小于等于原数组的个数)
3.排序:对数组tempNum进行排序 让第一个数据和后面的数据进行比较,若后面的数据小,就把小的数放在
第一个位置,同理,第二个数据和后面的数据进行比较,有比第二个数据小的放在第二个位置,依次类推
最后 得出新的数组是按照从小到大的顺序进行排列
4.输出排序后的数据
*/
#include<stdio.h> //头文件
int sortQ(void); //声明函数
int main(void){
sortQ(); //调用函数
return 0;
}
int sortQ(void){
int i,j,t,a,M=0,N,temp,min,num[100],tempNum[100];
scanf("%d",&N); //输入随机数的个数
for(i=0;i<N;i++){
scanf("%d",&a);
num[i]=a;
}
/* 去重:
循环数组num(一层循环),依次让temp指向数组中每一个数据,
temp在指向数组num中的值时,要循环temp所指向的
下标之后的数据(二层循环),如果temp和后面的数据有相等的话
就将后面的数据置为-1.二层循环结束后,若temp不是-1的话,就将temp的值
赋给数组tempNum,同时记录tempNum的下标. (这里不能用下标i,因为i下标对应的值
可能是-1,新的数组的个数小于等于原数组的个数)
*/
for(i=0;i<N;i++){
temp=num[i]; //temp指向i对应的数
for(j=i+1;j<N;j++){
if(temp==num[j]){ //判断temp是否等于后面的数据,若相等就把后面的数据置为-1
num[j]=-1;
}
}
if(temp!=-1){ //判断temp是否等于-1,不等于-1就把数组num中的值赋值给数组tempNum
tempNum[M]=temp;
M++; //记录新数组的下标
}
}
/* 排序:
对数组tempNum进行排序 让第一个数据和后面的数据进行比较,若后面的数据小,就把小的数放在
第一个位置,同理,第二个数据和后面的数据进行比较,有比第二个数据小的放在第二个位置,依次类推
最后 得出新的数组是按照从小到大的顺序进行排列
*/
for(i=0;i<M;i++){
for(j=i+1;j<M;j++){
if(tempNum[i]>tempNum[j]){
t=tempNum[i]; //下面三句是对两个数的交换
tempNum[i]=tempNum[j];
tempNum[j]=t;
}
}
}
printf("%d\n",M); //输出tempNum数组的长度(去重后数组的个数)
//输出tempNum数组排序后的值
for(i=0;i<M;i++){
printf("%d ",tempNum[i]);
}
return 0;
}