华为机试_明明的随机数【简单】

这篇博客介绍了如何解决明明生成的随机数问题,即删除重复数字并排序。作者分享了晚上重新审视问题时的领悟,赞叹了一种巧妙的编程思路,通过利用数组下标而非常规方法实现功能。文中提供了C语言的代码示例,并解释了while循环中EOF的用法。

代码来源:

题解 | #明明的随机数#_牛客博客 (nowcoder.net)https://blog.nowcoder.net/n/eb439afc86344e439c18feaa6aa4c15c

描述

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

数据范围: 1≤n≤1000  ,输入的数字大小满足 1≤val≤500 

输入描述:

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

输出描述:

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

2022.10.21下午看的,百思不得其解,评论区一片膜拜,但是晚上又看了一下,觉得醍醐灌顶,真的有人代码写得这么漂亮啊,这就叫牛逼!

其实就是摒弃一般的思路,而利用数组的下标来实现功能。

C语言代码:

#include <stdlib.h> //不知道是什么意思
#include <stdio.h>
#include <string.h> //数组
 
int main()
{
    int n; //规定输入数的个数
     
    int a;
    
    //以数组下标来存储随机数,下标对应的数组值为1,来说明是否是存储的随机数
    while(~scanf("%d", &n)) //如果输入的n不为0,那么就执行括号内的内容
    {
        int count[1001] = {0}; //初始化
		int i;                    //规定一个i
        for (i = 0; i < n; i++)
        {
            scanf("%d", &a);
            count[a] = 1;                //此时数组中以a为下标的那个值就为1
        }
        for (i = 0; i < 1001; i++)
        {
            if (count[i] == 1)            /*如果数组以i为下标的那个值为1,那么就将它输出,也就是说,按照从小到大的次序依次输出曾经有过输入的下标。很绝*/
            {
                printf("%d\n", i);
            }
        }
    }
     
    return 0;
}

以下转载于:https://blog.csdn.net/weixin_53936115/article/details/122086418

while(~scanf("%d", &n))  等价于 while(scanf("%d",&n)!=EOF)
        EOF,为End Of File的缩写,通常在文本的最后存在此字符表示资料结束。EOF通常的值为-1。

         while(~scanf("%d", &n)) 意思就是当有值输入的时候,进入while,当没有值输入时就结束while。(输入了值,如果scanf成功读取了就返回1,取反的结果不为0,进入while;如果scanf没有成功读取,返回0,取反的结果不为0,进入while;如果没有输入,到达文件末尾则返回-1,取反的结果为0,结束while。)

         注意:在终端(黑框)中手动输入时,系统并不知道什么时候到达了所谓的“文件末尾”,因此需要用<Ctrl + z>组合键然后按 Enter 键的方式来告诉系统已经到了EOF,这样系统才会结束while.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值