题目描述
给你N个数(n<=100),每个数都在(0~1000)之间,其中由很多重复的数字,请将重复的数字只保留一个,并将剩下的数由小到大排序并输出。
输入
输入有2行,第1行为1个正整数,表示数的个数:N 第2行有N个用空格隔开的整数。
输出
输出也是2行,第1行为1个正整数M,表示不相同数的个数。第2行为M个用空格隔开的整数,为从小到大排好序的不相同的数。
样例输入
10 20 40 32 67 40 20 89 300 400 15
样例输出
8 15 20 32 40 67 89 300 400
【基础】去除重复数字 Pascal
答案:4 悬赏:70 手机版
解决时间 2021-04-04 18:25
- 提问者网友:记得曾经
- 2021-04-03 22:36
最佳答案
- 五星知识达人网友:傲气稳了全场
- 2021-04-03 23:44
program ygb;
var a[0..1000] of integer; i,n,x:integer;
begin
for i:=0 to 1000 do a[i]:=-1;
read(n);
for i:=1 to n do
begin
read(x);
a[x]:=0;
end;
for i:=0 to 1000 do
if a[i]<>-1 then write(i,' ');
end.
程序不长,能看明白吧。
因为数字范围不大,所以定义了0~1000的数组,先全部赋值为-1表示该项没有数,读数字的时候把对应的数组单元修改为0,表示这个单元输入数字了,最后输出为0的部分。
巧妙的解决了两个问题,一是去处重复,二是排序,都不需要编写具体的代码,自然就是满足要求的结果。
var a[0..1000] of integer; i,n,x:integer;
begin
for i:=0 to 1000 do a[i]:=-1;
read(n);
for i:=1 to n do
begin
read(x);
a[x]:=0;
end;
for i:=0 to 1000 do
if a[i]<>-1 then write(i,' ');
end.
程序不长,能看明白吧。
因为数字范围不大,所以定义了0~1000的数组,先全部赋值为-1表示该项没有数,读数字的时候把对应的数组单元修改为0,表示这个单元输入数字了,最后输出为0的部分。
巧妙的解决了两个问题,一是去处重复,二是排序,都不需要编写具体的代码,自然就是满足要求的结果。
全部回答
- 1楼网友:上分大魔王
- 2021-04-04 04:00
var
f:array[0..1000]of boolean;
n,x,i,ans:longint;
begin
readln(n);
for i:=1 to n do begin
read(x);
if not f[x] then begin inc(ans);f[x]:=true;end;
end;
writeln(ans);
for i:=0 to 1000 do
if f[i] then write(i,' ');
writeln;
end.
- 2楼网友:洒脱疯子
- 2021-04-04 02:39
因为数字范围在0~1000,所以只需开一个0~1000的布尔数组,数组对应元素为true表示该数字出现过,为false表示没出现过
最后从0~1000扫一遍数组就解决了,超级简单~
满意望采纳谢谢!~
var
vis:array [0..1000] of boolean;
i,j,k,n,m:longint;
begin
fillchar(vis,sizeof(vis),0);//初始化全部数字都没出现过
m:=0;//初始化不重复的数字个数为0
readln(n);
for i:=1 to n do
begin
read(k);
if not vis[k] then//如果没出现过
begin
inc(m);//不重复的数字个数+1
vis[k]:=true;//标记为出现过
end;
end;
writeln(m);
for i:=0 to 1000 do
if vis[i] then break;//找到第一个出现过的数
write(i);//输出第一个出现的数
for j:=i+1 to 1000 do//继续找之后出现的数
if vis[j] then write(' ',j);//这一段的目的是使结尾没有空格,严格按照题目输出条件
writeln;
end.
- 3楼网友:青尢
- 2021-04-04 00:59
桶排序
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯