题目是:(2006 Noip 普及组复赛试题第一题)
明明的随机数
(random.pas/c/cpp)
【问题描述】
明明想在学校中请一些同学一起做一项问卷调查,为了实验的客观性,他先用计算机生成了N个1到1000之间的随机整数(N≤100),对于其中重复的数字,只保留一个,把其余相同的数去掉,不同的数对应着不同的学生的学号。然后再把这些数从小到大排序,按照排好的顺序去找同学做调查。请你协助明明完成“去重”与“排序”的工作。
【输入文件】
输入文件random.in 有2行,第1行为1个正整数,表示所生成的随机数的个数:
N
第2行有N个用空格隔开的正整数,为所产生的随机数。
【输出文件】
输出文件random.out 也是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
我的程序是:
program random;
var m,n:longint;
i,j,k:longint;
a:array[1..1000] of longint;
begin
assign(input,'random.in');reset(input);
assign(output,'random.out');rewrite(output);
readln(n);
for i:=1 to n do readln(a[i]);
for i:=1 to n-1 do
for j:= i+1 to n do
if a[i]>a[j] then
begin
k:=a[i];
a[i]:=a[j];
a[j]:=k;
end;
k:=0;
for i:=1 to n-1 do
if a[i]=a[i+1] then
begin
a[i]:=0;
k:=k+1;
m:=n-k;
end;
writeln(m);
for i:=1 to n do
if a[i]<>0 then write(a[i],' ');
close(input);
close(output);
end.
请各位高人帮我看看这个Pascal程序里哪里出错了?运行后输出的是空白。。。
答案:3 悬赏:0 手机版
解决时间 2021-02-16 23:24
- 提问者网友:精神病院里
- 2021-02-15 23:14
最佳答案
- 五星知识达人网友:风格不统一
- 2021-02-15 23:41
你这里有两问题,首先题目中“第2行有N个用空格隔开的正整数,为所产生的随机数。”你不应该用readln读入,这样你只能读入第一个数然后就换行读入了,因为后面文件没有内容,pascal将自动补零,就是说你读进来的永远是第一个数字和n-1个零。
第二个是你的输出,“第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。”你的输出应该是m个数,每两个数之间有一个空格同时以回车结尾,而你的输出是m个数每个数后有一个空格,就是说行末会多出一个空格,这样你的输出看起来和标准输出一样实际上是一分都得不到的。另外,一般题目不说,输出文件也应该以回车结尾,noip08浙江省分数太高后来就是用这个卡分数来着。
像真正复赛比赛的时候算法固然重要,输入输出格式几乎是同等重要的,向你这样不注意的话,一道会的题目100分没了,不是要悔的肠子都青了,多少前辈鲜血换来的教训啊.....
第二个是你的输出,“第2行为M个用空格隔开的正整数,为从小到大排好序的不相同的随机数。”你的输出应该是m个数,每两个数之间有一个空格同时以回车结尾,而你的输出是m个数每个数后有一个空格,就是说行末会多出一个空格,这样你的输出看起来和标准输出一样实际上是一分都得不到的。另外,一般题目不说,输出文件也应该以回车结尾,noip08浙江省分数太高后来就是用这个卡分数来着。
像真正复赛比赛的时候算法固然重要,输入输出格式几乎是同等重要的,向你这样不注意的话,一道会的题目100分没了,不是要悔的肠子都青了,多少前辈鲜血换来的教训啊.....
全部回答
- 1楼网友:痴妹与他
- 2021-02-16 01:15
读入应用read 输出最后 最好加个writeln
- 2楼网友:廢物販賣機
- 2021-02-16 01:08
你好!
刚开始读进错了,将readln(a[i])改为read(a[i])就行,
其实你可以用repeat,边读边比较和去除重复的.
如有疑问,请追问。
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯