首页 > 试题广场 >

明明的随机数

[编程题]明明的随机数
  • 热度指数:1633068 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
\hspace{15pt}对于明明生成的 n1500 之间的随机整数,你需要帮助他完成以下任务:
\hspace{23pt}\bullet\,删去重复的数字,即相同的数字只保留一个,把其余相同的数去掉;
\hspace{23pt}\bullet\,然后再把这些数从小到大排序,按照排好的顺序输出。
\hspace{15pt}你只需要输出最终的排序结果。

输入描述:
\hspace{15pt}第一行输入一个整数 n\ (1 \leqq n \leqq 1000),代表明明生成的数字个数。
\hspace{15pt}此后 n 行,第 i 行输入一个整数 a_i\ (1 \leqq a_i \leqq 500),代表明明生成的随机整数。


输出描述:
\hspace{15pt}输出若干行,每行输出一个整数,代表输入数据排序后的结果。第一行输出最小的数字。
示例1

输入

3
2
2
1

输出

1
2
#include <stdio.h>
#include <stdlib.h>
void merge(int *arr,int left,int right,int mid){
    int*temp=(int*)malloc((right-left)*sizeof(int));
    int index=0;//input temp index
    int mid1=mid,left1=left;
    while (left1<mid&&mid1<right){
        temp[index++]=arr[left1]<arr[mid1]?arr[left1++]:arr[mid1++];
    }
    while (left1<mid){
        temp[index++]=arr[left1++];
    }
    while (mid1<right){
        temp[index++]=arr[mid1++];
    }
    for(int i=0;i<index;i++){
        arr[left+i]=temp[i];
    }
    free(temp);
    return;
}

void mergensort(int *arr,int left,int right){
    if((right-left)<=1){
        return;
    }
    int mid=(left+right)/2;
    mergensort(arr,left,mid);
    mergensort(arr,mid,right);
    merge(arr,left, right,mid);
    return;
}
int main(){
    int n;
    scanf("%d",&n);
    int num[n];
    for(int i=0;i<n;i++){
        scanf("%d",&num[i]);
    }
    // n=del_(num, n);
    mergensort(num, 0, n);
    for(int i=0;i<n;i++){
        if(i>0&&num[i]!=num[i-1]){
            printf("%d\n",num[i]);
        }
        if(i==0){
            printf("%d\n",num[i]);
        }
    }
    return 0;
}
发表于 2025-03-14 00:36:58 回复(0)
#include <stdio.h>

int main() {
    int num=0;
    int numsize=0;
    int a[501]={0};//创造一个空数组,用数组下标表示当前数字,数组值表示当前数字是否存在
    scanf("%d",&numsize);//读总数
    for(int i=0;i<numsize;i++){
        scanf("%d",&num);
        a[num]++; 
    }
    for(int i=1;i<=500;i++){
        if(a[i]>0){
        printf("%d\n",i);
        }
    }

    return 0;
}


发表于 2025-03-12 21:58:33 回复(0)
#include <stdio.h>
#include <string.h>

int main() {
    int line=0;
    scanf("%d",&line);
    int flag[500+1]={0};
    int ch[1001]={0};
    int ch_last[1001]={0};
    int num=0;
    int temp;
    for(int i=0;i<line;i++)
    {
        scanf("%d",&ch[i]);
    }
    for(int i=0;i<line;i++)
    {
        if(flag[ch[i]]==0)
        {
            flag[ch[i]]=1;
            ch_last[num]=ch[i];
            num++;
        }
    }
    for(int i=0;i<num;i++)
    {
        for(int j=1;j<num-i;j++)
        {
            if(ch_last[i]>ch_last[i+j])
            {
                temp=ch_last[i];
                ch_last[i]=ch_last[i+j];
                ch_last[i+j]=temp;
            }
        }
    }
    for(int i=0;i<num;i++)  printf("%d\n",ch_last[i]);
    return 0;
}
发表于 2025-02-28 13:12:35 回复(0)
#include <stdio.h>

int main() {
    int n;
    scanf("%d", &n);

    int ziDian[500] = {0};

    for (int i = 0; i < n; i ++){
        int t;
        scanf("%d", &t);
        ziDian[t - 1] = 1;
    }

    for (int i = 0; i < 500; i ++){
        if (ziDian[i] != 0){
            printf("%d\n", i + 1);
        }
    }
    
    return 0;
}

发表于 2025-02-07 18:08:06 回复(0)
//有注释,不是最简代码,胜在有步骤
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void bubble_sort(int* arr, int len_t) {
    for (int i = 0; i < len_t; i++) {
        for (int j = 0; j < len_t - i - 1; j++) {
            if (arr[j] > arr[j + 1]) {
                int temp = arr[j];
                arr[j] = arr[j + 1];
                arr[j + 1] = temp;
            }
        }
    }
}

void print_arr(int* arr, int len_t) {
    for (int i = 0; i < len_t; i++) {
        printf("%d\n", arr[i]);
    }
}

int main() {
    int n = 0; // 代表生成的数字个数
    scanf("%d", &n);
    if (n < 1 || n > 1000) {
        exit(-1);
    }

    // 创建动态数组,长度由用户输入
    int* arr = (int*)malloc(n * sizeof(int));
    if (NULL == arr) {
        perror("malloc\n");
        exit(-1);
    }

    // 输入随机数
    for (int i = 0; i < n; i++) {
        scanf("%d", &arr[i]);
    }

    // 定义哈希数组并写入哈希表
    int arr_hash[501] = {0};
    for (int i = 0; i < n; i++) {
        int index = arr[i];
        arr_hash[index] += 1;
    }

    // 定义数组2,接住去重后的随机数
    int* arr2 = (int*)malloc(n * sizeof(int));
    if (NULL == arr2) {
        perror("malloc failed!\n");
        return -1;
    }

    int j = 0;
    for (int i = 0; i < 501; i++) {
        if (arr_hash[i] > 0) {
            arr2[j] = i;
            j++;
        }
    }

    // 调整 arr2 的大小
    int* new_arr2 = (int*)realloc(arr2, j * sizeof(int));
    if (new_arr2 == NULL) {
        free(arr2); // 释放原内存块
        printf("Memory reallocation failed!\n");
        exit(1); // 退出程序或处理错误
    } else {
        arr2 = new_arr2; // 更新指针
    }

    int len = j;  // 更新 len 的值
    bubble_sort(arr2, len);
    print_arr(arr2, len);

    // 释放内存
    free(arr);
    free(arr2);

    return 0;
}


发表于 2025-02-02 00:21:41 回复(0)
#include <stdio.h>

int main() {
    int a[500];
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);     //将所有的数都输入到a[]里面(注意从a[1]开始)
    }
    for(int i=1;i<=n;i++){      //对a[]进行插入排序
        int j,temp=0;
        if(a[i]<a[i-1]){
            temp=a[i];
            for(j=i-1;j>0&&a[j]>temp;--j){
                a[j+1]=a[j];
            }
            a[j+1]=temp;
        }
    }
    for(int i=1;i<=n;i++){
        if(a[i+1]-a[i]){
            printf("%d\n",a[i]);    //如果前后的数不一样,则输出数字
        }
    }
    return 0;
}
发表于 2025-01-01 17:24:44 回复(0)
这个题目是不是有歧义啊,“此后 n行,第 i 行输入一个整数 ai (1≦ai≦500)ai (1ai500),代表明明生成的随机整数。”,原来不是输入n生成n个随机数啊,是输入读取去重之类的就对了,真无语,这是考语文吧。
我写:#include <stdio.h>
#include <stdlib.h>
#include <time.h>

// 选择排序函数
void selectionSort(int *array, int n) {
    for (int i = 0; i < n - 1; i++) {
        int minIndex = i;
        for (int j = i + 1; j < n; j++) {
            if (array[j] < array[minIndex]) {
                minIndex = j;
            }
        }
        if (minIndex != i) {
            int temp = array[i];
            array[i] = array[minIndex];
            array[minIndex] = temp;
        }
    }
}

// 去重函数
void removeDuplicates(int *array, int *n) {
    if (*n == 0) return;
    for (int i = 0; i < *n - 1; i++) {
        if (array[i] == array[i + 1]) {
            for (int j = i + 1; j < *n - 1; j++) {
                array[j] = array[j + 1];
            }
            (*n)--;
            i--; // 重新检查当前位置
        }
    }
}

int main() {
    srand((unsigned int)time(NULL)); // 设置随机数种子

    int n;
    printf("请输入数字个数n(1≦n≦1000):");
    scanf("%d", &n);
    int *array = (int *)malloc(n * sizeof(int)); // 动态分配数组存储输入的数字
    // 生成n个1到500之间的随机整数
    for (int i = 0; i < n; i++) {
        array[i] = rand() % 500 + 1; // 生成1到500之间的随机数
    }

    // 使用选择排序进行排序
    selectionSort(array, n);

    // 去重
    removeDuplicates(array, &n);

    // 输出排序后去重的结果
    for (int i = 0; i < n; i++) {
        printf("%d\n", array[i]);
    }

    free(array); // 释放动态分配的内存
    return 0;
}带生成随机数的就不对,之间读取然后去重就对,真是坑!!:#include <stdio.h>
#include <stdlib.h>

// 选择排序函数
void selectionSort(int *array, int n) {
    for (int i = 0; i < n - 1; i++) {
        int minIndex = i; // 假设当前元素是最小值
        for (int j = i + 1; j < n; j++) {
            if (array[j] < array[minIndex]) {
                minIndex = j; // 找到更小的元素
            }
        }
        // 交换当前元素和找到的最小值
        if (minIndex != i) {
            int temp = array[i];
            array[i] = array[minIndex];
            array[minIndex] = temp;
        }
    }
}

int main() {
    int n;
    scanf("%d", &n); // 读取数字个数
    int *array = (int *)malloc(n * sizeof(int)); // 动态分配数组存储输入的数字

    // 读取 n 个数字
    for (int i = 0; i < n; i++) {
        scanf("%d", &array[i]);
    }

    // 使用选择排序进行排序
    selectionSort(array, n);
    // 输出排序后的结果,由于数组中可能存在重复数字,所以只输出不重复的数字
    int lastPrinted = -1; // 用于记录上一次打印的数字
    for (int i = 0; i < n; i++) {
        if (array[i] != lastPrinted) {
            printf("%d\n", array[i]);
            lastPrinted = array[i];
        }
    }

    free(array); // 释放动态分配的内存
    return 0;
}

发表于 2024-12-26 16:58:21 回复(0)
用哈希表实现:
#include <stdio.h>

int main() {
    int totalNum,tempdata,i;
    static int data[500];

    scanf("%d",&totalNum);
    for(i=0;i<totalNum;i++)
    {
        scanf("%d",&tempdata);
        (data[tempdata-1])++;
    }
    for(i=0;i<500;i++)
    {
        if(data[i])
            printf("%d\r\n",(i+1));
    }    
    return 0;
}

发表于 2024-12-04 21:22:32 回复(0)
全通过
#include <stdio.h>
int main() {
    int min = 1, max = 500;
    int n;
    scanf("%d",&n);
    int num[n];
    int count=0;//计数
    int location;//位置
    int temp;//暂存数字
    int k1;
    for(int i=0;i<n;i++)
    {
        scanf("%d",&k1);    
        num[i]=k1;
    }
    for(int i=0;i<n;i++)
    {
        count=0;
        for(int j=0;j<n;j++)
        {
            if(num[i]==num[j])
            {
                count++;
                location = j;
            }
            if(count>=2)
            {
                num[location]=0;
                count=0;
            }
        }
    }
    for (int i = 0; i < n; i++) {
        // 内层循环进行相邻元素的比较和交换
        for (int j = 0; j < n-i-1; j++) {
            // 如果相邻元素顺序错误,交换它们
            if (num[j] > num[j+1]) {
                temp = num[j];
                num[j] = num[j+1];
                num[j+1] = temp;
            }
        }
    }
   
    for(int i=0;i<n;i++)
    {
        if(num[i]>0)
        {
            printf("%d",num[i]);
            printf("\n");
        }  
    }
   
    return 0;
}
发表于 2024-11-20 16:21:58 回复(0)
#include <stdio.h>
int GET[1010]={'\0'};
int val[501]={0};
int main() {
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d\n",&GET[i]);
        val[GET[i]]=1;
    }
    for(int i=1;i<501;i++){
        if(val[i]==1){
            printf("%d\n",i);
        }
    }
    return 0;
}
发表于 2024-09-12 21:04:52 回复(0)
#include <stdio.h>

int main() {
    int j, k;
    int i = 0, n = 0, cf = 0;
    volatile int nums[1000];
    scanf("%d", &n);
    while (i < n) {
        scanf("%d", &nums[i++]);
    }

    for(j=0; j<n-1; j++)
        for(k=0; k<n-1; k++)
        {
            if(nums[k] > nums[k+1])
            {
                nums[k] = nums[k] ^ nums[k+1];
                nums[k+1] = nums[k] ^ nums[k+1];
                nums[k] = nums[k] ^ nums[k+1];
            }
            else if((nums[k] == nums[k+1]) && (nums[k] != 501))
            {
                nums[k+1] = 501;
                cf++;
            }
        }

    for(i=0; i<n-cf; i++)
        printf("%d\n", nums[i]);
    return 0;
}
发表于 2024-07-24 01:17:42 回复(0)
#include <stdio.h>

int main() {
    int num,numbers[501]={0},n;
    scanf("%d\n",&num);
    while(num--)
    {
        scanf("%d\n",&n);
        numbers[n]=n;
    }
    for(int i=0;i<501;i++)
    {
        if(numbers[i]!=0)
        printf("%d\r\n",numbers[i]);
    }
}
发表于 2024-07-07 09:12:52 回复(0)
#include "stdio.h"
#include "string.h"
//思路:四部分,输入,去重,排序,最后输出。——可以直接先排序,之后去重和输出合为一体(输出不重复部分)
void upper_bubble_sort(int val[],int n)
{
    int a = 0,b = 0,temp;
    for(;a < n; a++)
    {
        for(b = 0; b < n -a -1; b++)
        {
            if (val[b] > val[b+1])
            {
                temp = val[b];
                val[b] = val[b+1];
                val[b+1] = temp;
            }
        }
    }
}
int main()
{
    //输入部分。其中:n为数据个数,val数组存放输入的数字。
    int n,val[1000],i,out[1000],c;
    scanf("%d",&n);
    for(i = 0; i < n; i++)
    {
        scanf("%d",&val[i]);
    }
    //也可以先排序再去重?先试试冒泡吧。
    //排序部分
    upper_bubble_sort(val,  n);
    //去重和输出合为一体,即直接输出不重复部分。
    printf("%d\n",val[0]);
    for (i = 0; i < n -1; i++) //这里不是n-1的话会溢出,吃过一次亏引以为戒
    {
       if (val[i] < val[i + 1]) 
       {
        printf("%d\n",val[i+1]);
       }
    }
}

编辑于 2024-04-07 16:34:33 回复(1)
#include <stdio.h>
int main() {
    int i,s;
    int a[1000];
    int num=0;
    int temp;
    scanf("%d",&num);
    for (i=0; i<num; i++) {
    scanf("%d",&a[i]);
    }
    for (i=0; i<num; i++) {
    for (s=0; s<num; s++) {
         if (a[i]<a[s]) {
            temp=a[i];
            a[i]=a[s];
            a[s]=temp;
        }
    }
    }
   
    for (i=0; i<num; i++) {
    if (a[i]==a[i+1]) {
    continue;;
    }
    printf("%d\n",a[i]);
    }

    return 0;
}
编辑于 2024-03-26 17:17:05 回复(0)
#include "stdio.h"
#include "string.h"
//有序数组的接口函数
int RankedArray(int n) {
    int input_randomnum=0; //输入的随机数
    //初始化一个数组,用于表示随机数集合中的元素(某个0~1000之间的随机整数)的有无情况
    int a[1001] = {0};
    //连续输入 n 个随机整数
    while (n--) {
        scanf("%d", &input_randomnum);
        //数组的下标等于输入的随机整数,下标对应的元素为 1 表示该随机整数存在
        a[input_randomnum] = 1;
    }
    //按从小到大的顺序,依次输出随机数集合(数组)中所包含的随机整数
    for (int i = 0; i < 1001; i++) {
        if (a[i] == 1) {
            printf("%d\n", i);
        }
    }
    return 0;
}
//主函数
int main() {
    int n=0; //输入随机数的个数
    while (scanf("%d", &n) != EOF) {
        RankedArray(n); //调用有序数组的接口函数
    }
    return 0;
}
编辑于 2024-03-22 16:05:11 回复(0)
#include <stdio.h>

int main() {
    int n;
    scanf("%d", &n);
    int a[500] = {0};

    int num = 0;
    for (int i = 0; i < n; i++) {
        int x;
        scanf("%d", &x);
        a[x - 1] += 1;
    }

    for (int i = 0; i < 500; i++) {
        if (a[i] > 0) {
            printf("%d\n", (i + 1));
        }
    }
    return 0;
}

编辑于 2024-02-28 17:57:32 回复(0)
#include <stdio.h>

int main() {
    int n, i = 0;
    scanf("%d", &n);
    int num;
    int check[500] = {0};
    while (scanf("%d", &num) != EOF) {
        check[num] = 1;
        }
    for (int j=0;j<500;j++) {
        if (check[j] == 1) {
            printf("%d\n", j);
        }
    }
    return 0;
}

编辑于 2023-12-25 10:50:23 回复(1)
//这个也能算较难?
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

int main() 
{
    //输入
    int m =0;
    int arr[1000]={0};
    int i =0;
    int haxh[501]={0};
    scanf("%d",&m);
    //去重复
    for(i =  0;i<m;i++)
    {
        scanf("%d",&arr[i]);
        if(haxh[arr[i]] ==0)
            haxh[arr[i]]=1;
    }
    //排序
    for(i=0;i<501;i++)
    {
        if(haxh[i])
        {
            printf("%d\n",i);
        }
    }
    return 0;
}

编辑于 2023-12-13 16:41:12 回复(1)

BitMap去重

#include<stdbool.h>
#include<stdlib.h>
#include<stdio.h>

#define MAX_NUM 500

unsigned char* creatBitMap(int n);
bool isExist(unsigned char* base,unsigned int n);
void input(unsigned char* base);
unsigned int byteStep(unsigned int n);  // 返回数字n相较base位置
unsigned char bitAddr(unsigned int n);  // 返回数字n所在bit的地址(0 ~ 7)
unsigned int getNum(unsigned int step, unsigned char bit);  //返回 *(base + step)第bit所代表的数字
void printNum(unsigned char* base, int step);  //打印对应byte的所有数字
void addNum(unsigned char* base, unsigned int n);


int main() {
    int n = 0;
    scanf("%d", &n);

    unsigned char* base = creatBitMap(n);

    for (int i = 0; i < n; i++) {
        input(base);
    }

    for (int i = 0; i < MAX_NUM + 1; i++) {
        printNum(base, i);
    }

    free(base);
    return 0;
}


// 程序结束时手动销毁
unsigned char* creatBitMap(int n) {
    unsigned char* base = (unsigned char*)calloc(MAX_NUM + 1, sizeof(char));
    return base;
}


// 输入至位图
void input(unsigned char* base) {
    int val = 0;
    scanf("%d", &val);
    addNum(base, val);
}


void addNum(unsigned char* base, unsigned int n) {
    int step = byteStep(n);
    char bit_addr = bitAddr(n);
    char binary = 1 << bit_addr;
    *(base + step) |= binary;
}


unsigned int byteStep(unsigned int n) {
    unsigned int step = n / 8;
    return step;
}


unsigned char bitAddr(unsigned int n) {
    unsigned bit = n % 8;
    return bit;
}


unsigned int getNum(unsigned int step, unsigned char bit) {
    return step * 8 + bit;
}


void printNum(unsigned char* base, int step) {
    for (int i = 0; i < 8; i++) {
        unsigned num = getNum(step, i);
        if (isExist(base, num)) {
            printf("%d\n", num);
        }
    }
}

bool isExist(unsigned char* base, unsigned num) {
    int step = byteStep(num);
    int bit = bitAddr(num);
    if (*(base + step) & 1 << bit) {
        return true;
    } else {
        return false;
    }
}
发表于 2023-11-20 03:55:16 回复(0)
#include <stdio.h>
int main()
{
    int arr[500]={0};
    int len,input,i=0;
   
    scanf("%d",&len);
    while(1)
    {
        scanf("%d",&input);
        if(1<=input<=500)
        {
            arr[input-1]=input;
        }
        if(!len--)
        {
            while(i<500)
            {
                if(arr[i]>0)
                {
                    printf("%d\n",arr[i]);
                }
                i++;
            }        
            break;
        }
    }  
    return 0;
}

发表于 2023-09-14 23:45:37 回复(0)

问题信息

难度:
66条回答 290829浏览

热门推荐

通过挑战的用户

查看代码
明明的随机数