首页 > 试题广场 >

明明的随机数

[编程题]明明的随机数
  • 热度指数:1547881 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

明明生成了N个1到500之间的随机整数。请你删去其中重复的数字,即相同的数字只保留一个,把其余相同的数去掉,然后再把这些数从小到大排序,按照排好的顺序输出。

数据范围: ,输入的数字大小满足

输入描述:
第一行先输入随机整数的个数 N 。
接下来的 N 行每行输入一个整数,代表明明生成的随机数。
具体格式可以参考下面的"示例"。


输出描述:

输出多行,表示输入数据处理后的结果

示例1

输入

3
2
2
1

输出

1
2

说明

输入解释:
第一个数字是3,也即这个小样例的N=3,说明用计算机生成了3个1到500之间的随机整数,接下来每行一个随机数字,共3行,也即这3个随机数字为:
2
2
1
所以样例的输出为:
1
2       
#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)
为啥我复制了一模一样的代码,提交以后,运行时间比人家的要长很多,人家是1ms,我是4ms,是电脑的原因吗
发表于 2023-08-16 20:03:09 回复(1)
//关键点:利用数组下标去保存重复的数字,桶排序。
#include <stdio.h>
int main() {
    int n,val[501]={0},new[500]={0},temp,i,j=0,k;
    scanf("%d",&n);
    for(i=0;i<n&&i<1000;i++)
    {
    scanf("%d",&temp);
    val[temp]=temp;
    }
    for(i=1;i<501;i++)
    {
        if(val[i]!=0)
        {
            new[j]=val[i];
            j++;
        }
    }
    for(i=0;i<j;i++)
    printf("%d\n",new[i]);
    return 0;
    }

发表于 2023-07-25 00:58:09 回复(0)
#include <stdio.h>

int main() {
    char data[500] = {0};
    int num, val;

    scanf("%d", &num);
    for(int i=0; i<num; i++) {
        scanf("%d", &val);
        data[val] = 1;
    }

    for(int i=0; i<500; i++)
        if(data[i])
            printf("%d\n", i);

    return 0;
}
发表于 2023-05-11 00:08:45 回复(0)
#include <stdio.h>//桶排序,牛友可以去B站搜讲解这个的,很简单就能做出来,无需开辟动态空间
//桶排序
int main() {
     int arr[1005]={0},n,t,i,num=0;
     scanf("%d",&n);
     for(i=1;i<=n;i++)//往桶里面存数,用1去标志有数的桶,输入N个数
     {
        scanf("%d",&t);
        arr[t]=1;
     }
     for(i=1;i<=1000;i++)
     {
        if(arr[i]==1)
        {
            printf("%d\n",i);
        }
     }
     


    
    return 0;
}

发表于 2023-04-03 11:48:45 回复(2)
/**  题目:HJ3 明明的随机数
  *  思路:声明数组array[501]并初始化为 0,用 temp 记录输入数字,将 array[temp] 置为 1,按序输出值为 1 的数组下标
  *  难点:利用下标记录数值,利用数组存储的数值表示下标是否出现
  */
#include <stdio.h>

int main() {
    int array[501] = {0};
    int num;
    int temp;
    int i = 0;

    scanf("%d", &num);

    // 依次输入的数字用temp存储,并将array[temp] 置为1
    for(; i < num; i++) {
        scanf("%d", &temp);
        array[temp] = 1;
    }

    //  遍历数组array,输出值为 1 的下标
    for(int j = 1; j < 501; j++) {
        if(array[j] == 1) {
            printf("%d\n", j);
        }
    }

    return 0;
}

发表于 2023-03-26 17:56:20 回复(0)
#include <stdio.h>

int main() {
    int num = 0;
    int arr[1000]={0};
    int temp = 0;
    scanf("%d",&num);
    for(int i=0;i<num;i++)
    {
        scanf("%d",&temp);
        arr[temp] = 1;
    }
    for(int i=0;i<=500;i++)
    {
        if(arr[i]==1)
        {
            printf("%d\n",i);
        }
    }
    return 0;
}
发表于 2023-03-16 14:31:16 回复(0)
#include <stdio.h>
#include <stdlib.h>

#define MAX_VAL 500
int main() {
    int a[MAX_VAL], b;
    int i,n;

    memset(a, 0 , sizeof(int)*MAX_VAL);

    if (scanf("%d", &n) != EOF) {
        if (n >=1 && n<= 1000) {
            while (n) { 
                n--;
                if (scanf("%d", &b) != EOF) {
                    if (b >=1 && b<= MAX_VAL) {  
                        a[b-1] = 1;
                    } else {
                        printf("b over\n");              
                    }        

                } else {
                    printf("none\n");              
                }
            }   
        } else {
            printf("n over\n");      
        }
    }

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

发表于 2022-12-18 17:29:25 回复(0)
还是新手,写的比较繁琐,但是不知道为啥输出错误😥
#include"stdio.h"
#include"stdlib.h"
void bubble_sort(int *p,int n)
{
    int i = 0 , j =0;
    for(i=0;i<n-1;i++)
    {
        j=0;
        for(j=0;j<n-i-i;j++)
        {
            if(p[j]>p[j+1])
            {
                int tmp = p[j];
                p[j]=p[j+1];
                p[j+1]=tmp;
            }
        }
    }
}

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

void ShortenArr(int * p,int n)
{
	int i = 0;
	int j = 0;
	for(i=0;i<n;i++)
	{
		if(p[i] == 0)
		{
			for(j=i;j<n-i;j++)
			{
				p[j]=p[j+1];
			}
		}
	}
	
}

int FindRenumber(int * p,int n)
{
	int i = 0;
	int count;
	for(i=0;i<n-1;i++)   // 注意这里容易出现野指针 
	{
		if(p[i] == p[i+1])
		{
			count++;
			p[i]=0;
		}
	}
	return count;
}
//主程序开始
int main ()
{
    int n ; // 所输入的数据个数
    scanf("%d",&n); 
    int *arr;
    arr = (int *) malloc (n*sizeof(int));
    if(arr == NULL)
    {
        exit(-1);
    }
    int i = 0;
    // 输入数据
    for(i=0;i<n;i++)
    {
        scanf("%d",&arr[i]);
    }
    bubble_sort(arr,n);  //排序
    int lastlen = FindRenumber(arr,n);  // 查找重复的数字并删除 
    ShortenArr(arr,n);
    ShowArr(arr,n-lastlen);  // 打印数组 
    return 0;
}

发表于 2022-11-11 21:43:08 回复(0)
#include<stdio.h>
#include<string.h>
int main()
{
    int arr[1000]={0};
    int i,j,temp,num;
    while(scanf("%d",&num)!=EOF)
    {
        for(i=0;i<num;i++)
        {
            scanf("%d",&arr[i]);
        }
        for(i=0;i<num;i++)
        {
            temp=arr[i];
            for(j=i+1;j<num;j++)
            {
                if(temp>arr[j])
              {
                     arr[i]=arr[j];
                    arr[j]=temp;
              }
            }   
         }
       printf("%d\n",arr[0]);
       if (num>=1)
        {
            for(i=1;i<num;i++)
           {
             if(arr[i]>arr[i-1])
                 printf("%d\n",arr[i]);
           }
        }      
    }
    return 0;
}

发表于 2022-09-07 12:20:22 回复(0)
提供一种我认为最优化的一个思路:
#include<stdio.h>
int main() {
    int N;
    scanf("%d", &N);
    int str[500];
    memset(str, 0, sizeof(str));
    int n;
    while (scanf("%d\n", &n) != EOF)
        str[n] = 1;
    for (int i = 0; i < 500; i++) {
        if (str[i] != 0)
            printf("%d\n", i);
    }
    return 0;
}


发表于 2022-07-30 02:25:24 回复(3)

问题信息

难度:
54条回答 286017浏览

热门推荐

通过挑战的用户

查看代码