2、明明的随机数

news/2024/7/8 12:03:01
题目描述

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

输入格式

输入有2行,第1行为1个正整数,表示所生成的随机数的个数:

N

第2行有N个用空格隔开的正整数,为所产生的随机数。

输出格式

输出也是2行,第1行为1个正整数M,表示不相同的随机数的个数。第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。

解答:同样用顺序存储结构即数组,排序上一题已经做过,所以本题的重点为如何去重复,基于我现在掌握的知识,我想到的办法为:先将数组排序,然后寻找某元素之前有无与该元素相同的元素,如果有则将相同元素删去,删除用到的方法就是被删除元素之后所有的元素向前进位。
 
具体代码:
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <malloc.h>
 4 #define MAXSIZE 100
 5  
 6 typedef int status;
 7 typedef struct{
 8     int key;
 9 }Redtype;
10  
11 typedef struct{
12     Redtype r[MAXSIZE];
13     int length;
14 }*SqList, LNode;
15  
16 void SelectSort(SqList L){
17     Redtype temp;
18     int i;
19     for (i = 0; i < L->length; i++){
20         int l=i;
21         int j;
22         for (j = i + 1; j < L->length; j++){
23             if (L->r[j].key < L->r[l].key)
24                 l = j;
25         }
26         if (i != l){
27             temp = L->r[i];
28             L->r[i] = L->r[l];
29             L->r[l] = temp;
30         }
31     }
32 }
33  
34 int LocateRepeat(SqList L, int j){
35     int i = 1;
36     while (i < j){
37         if (L->r[i - 1].key != L->r[j - 1].key)
38             i++;
39         else
40             break;
41     }
42     if (i < j){
43         return i;
44     }
45     else{
46         return 0;
47     }
48 }
49  
50 int main(int argc,char *argv[]){
51     SqList L;
52     L = (LNode*)malloc(sizeof (LNode));
53     scanf("%d", &L->length);
54     if (L->length > MAXSIZE)
55         exit(0);
56     int i;   
57     for (i= 0; i < L->length; i++){
58         scanf("%d", &L->r[i].key);
59         if (L->r[i].key<1 || L->r[i].key>1000)
60             break;
61     }
62     SelectSort(L);
63     int m = 2;
64     while(m <= L->length){
65         int j = LocateRepeat(L, m);
66         if (j != 0){
67             for (j; j < L->length; j++){
68                 L->r[j - 1] = L->r[j];
69             }
70             --L->length;
71         }
72         else
73             m++;
74     }
75     printf("%d\n", L->length);
76     int n;
77     for (n = 0; n < L->length; n++){
78         printf("%d ", L->r[n].key);
79     }
80     return 0;
81 }

 

由本题得到的领悟:
1、RQNOJ不支持C99,即如果用C语言提交,不能出现C99的标准。对于今天来讲,for的格式,C和C99就有区别:对于C99,可以这样定义:
for(int i=0;i<n;i++);
而对于C,只能如下定义,
int i;
for(i=0;i<n;i++)
所以注意区分。
2、去重复出现的几个问题:
     a、无法定位重复元素所在位置,原因是没有考虑查找到相同元素之后如何处理,导致i一直自增;解决方法:for循环改为while循环,当找到相同元素则用break跳出循环,即可定位重复元素。
    b、只能去除一个重复元素,原因是main函数里,无论有无找到重复元素都m会加一,删除了重复元素之后,原来数组元素的位置都向前进了一位,此时m加一,就无法删除另外的重复元素。所以解决办法是只在找不到重复元素时再加一,这样就可以保证所有的重复元素都可以剔除。
3、RQNOJ的运行平台为Linux,所以对C语言main函数的定义有所区别,即int main(int argc,char *argv[])多加两个参数即可。

转载于:https://www.cnblogs.com/langzi1996/p/6391808.html


http://www.niftyadmin.cn/n/1176892.html

相关文章

matlab之判断回文数,C++代码札记(四)判断一个数是否为回文数

&#xfeff;&#xfeff;/*判断一个数是否为回文数,要求一行显示8个,每个数占6列显示*/string 判断回文数(int 回文数 98){/*任意不超过10位的数*/int 数位[10]{0}, 位(0), 半(0);string 是否("是");do{数位[位] 回文数 % 10;} while (回文数 / 10);do{if (数位[-…

AC日记——组合数问题 落谷 P2822 noip2016day2T1

题目描述 组合数表示的是从n个物品中选出m个物品的方案数。举个例子&#xff0c;从&#xff08;1,2,3) 三个物品中选择两个物品可以有&#xff08;1,2),(1,3),(2,3)这三种选择方法。根据组合数的定 义&#xff0c;我们可以给出计算组合数的一般公式&#xff1a; 其中n! 1 2 …

matlab 子程序 主程序,MATLAB 主程序和子程序之间的问题 子程序出错

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼子程序如下&#xff1a;function [Xd,Ad,Bd,A,B,g0,h0]initial_h0(n,k,Wa,SRLa,SXLa)% This function generates the initial guess for the numerator polynomial% h(p).%--------------------Inputs:%Wa: Normalized angular fre…

程序员第一次软件实习需掌握的5大技巧

2019独角兽企业重金招聘Python工程师标准>>> 如果你正在阅读这篇文章&#xff0c;并且刚刚拿到你的第一份实习offer&#xff0c;那么恭喜你&#xff01;你的辛勤工作、熬夜学习、专研技术等等努力通通没有白费。面试官非常欣赏你&#xff0c;你拿到了临时签约的offe…

20145222GDB调试汇编堆栈过程分析

GDB调试汇编堆栈过程分析 实践代码example.c #include<stdio.h> short addend1 1; static int addend2 2; const static long addend3 3;static int g(int x) {return x addend1; } static const int f(int x) {return g(x addend2); }int main(void) {return f(8)…

linux利用grep查看打印匹配的下几行或前后几行的命令

转自&#xff1a;http://www.itokit.com/2013/0308/74883.html linux系统中&#xff0c;利用grep打印匹配的上下几行 如果在只是想匹配模式的上下几行&#xff0c;grep可以实现。$grep -5 parttern inputfile //打印匹配行的前后5行$grep -C 5 parttern inputfile //打印匹配行…

lorenz画图matlab,Matlab画Lorenz系统的最大李雅普诺夫指数图

Lorenz 系统文档分两个文件方程m文件和计算L指数m文件分开写&#xff0c;复制粘贴即可运行matlab2012a&#xff0c;改写方程文件和参数即可算自己的系统&#xff0c;其中最大L指数用的是经典的柏内庭(G.Benettin)计算方法&#xff0c;准确快速无误&#xff01;附计算结果图&…

客户端的用户登录信息如何保存

问题描述用户登录之后&#xff0c;登录之后进入每个的Activity&#xff0c;都可以获得用户名&#xff0c;用户名一般保存在哪&#xff1f;我是新手&#xff0c;请大家指导~~ 解决方案1android有5个保存机制&#xff0c;你想保存哪里就保存哪里 解决方案2一般情况下&#xff0c;…