P1059 [NOIP2006 普及组] 明明的随机数

题目描述

明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了 �N 个 11 到 10001000 之间的随机整数 (�≤100)(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。

1.题目分析:

该题主要考察对数组,循环,判断以及桶排序的运用。

2.题目思路:

桶排序:标记思想,将数据放入一个长度大于等于最大数据大小的数组里,将出现过的数据标记次数。通过直接for循环遍历桶,实现对数据去重,排序的目的。

本题需要创建一个足够长的数组,作为桶,第一次循环,依次输入每个数据,标记为1,如果出现过的,判断后不予标记,并记录数据出现的次数。

第二次循环,直接遍历桶,标记为1的打印其数组下标,以便得到结果,完。

3.代码演示:

#include 

int main(){
    int arr[1000] = {0};
    //随机数个数N
    int n;
    int num;
    //去重后的个数
    int count = 0;
    //输入
    scanf("%d",&n);
    for (int i = 0; i < n; i++) {
        scanf("%d",&num);
        //出现过的数直接跳过
        if (arr[num] == 1){
            continue;
        }
        //未出现过的数标记为1
        arr[num]++;
        //记录数量
        count++;
    }
    printf("%d\n",count);
    for (int i = 0; i < 1000; i++){
        //直接依次打印桶中的数据
        if (arr[i] == 1){
            printf("%d ",i);
        }
    }
    return 0;
}

你可能感兴趣的:(刷题go,go,go,算法)