明明的随机数
题目描述
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。
题意总结:给你n个数,让你将这些数去重并升序排序输入描述
有2行,第1行为1个正整数,N,表示有N个数字
第2行有N个用空格隔开的正整数。
输出描述
第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 a[1010];
int main()
{
//输入
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
//排序
for (int i = 0; i < n - 1; i++)
{
for (int j = 0; j < n - 1 - i; j++)
{
if (a[j] > a[j + 1])
{
int t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
//15 20 20 32 40 40 67 89 300 400
//去重
for (int i = 0; i < n-1; i++)//i<n的时候a[i+1]会越界
{
if (a[i] == a[i + 1])
{
for (int j = i; j < n - 1; j++)//让后面的数组依次往前移动
{
a[j] = a[j + 1];
}
n--;
i--;
}
}
//输出
printf("%d\n", n);
for (int i = 0; i < n; i++)
{
printf("%d ", a[i]);
}
}
顶级思路:
#include<stdio.h>
int a[1001];
int main()
{
int n, t, i;
int count = 0;//数字的个数
scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf("%d", &t);
if (a[t] == 0)//如果a[t]是空的
{
a[t] = t;//把输入的数赋给a[t]
//顺便给排序了!!!牛
count++;//数字的个数++
}
}
printf("%d\n", count);
for (i = 0; i < 1001; i++)//循环的目的是检查这1001个位置中的每一个,看是否有存储的值(即非0值),如果有,则输出该值。
{
if (a[i] != 0)//a[i]上没空位,都占满了
printf("%d ", a[i]);
}
return 0;
}
这个思路可太牛了,学习学习