| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
被总是WA困扰的各位注意了!我有个发现!我一般都是编程序时用文件输入、文件输出(黑盒)的测试方法,提交时再删了。
但是,这里有个问题,用“黑盒”的方法看不出来,竟困扰了我2个多小时——
对于每次有很多组数据的题,我们一般都按这种处理结构:
语句(可加循环条件)
输入一组数据
处理本组数据
输出本组数据的结果
语句(可加循环条件)
各位应该知道,这里的程序测试方法,都是要先把输入数据全输完,再看结果。
而这种结构,是输入一组,出一组结果;输入一组,出一组结果……所以在这里,这种结构是不可取的。
(如果明白了,下面就不用看了)
而应该用这样的两种结构之一:
A
语句(可加条件)
输入一组数据
处理本组数据
将结果储存至一个数组
语句(可加条件)
然后用For循环按顺序输出结果
B
先输入数据,并储存至数组
然后挨组处理,并输出(或等处理完所有数据后一起输出)
对于本题,用第一种更好。
要注意(comicxmz001已经提到)数组定义100不够,会溢出
不用定义10000,定义1000就够
这样就可以了。
如果你还不明白,就看看代码(中国剩余定理,Pascal语言)
这个代码是正确的(输入完所有的再输出所有的):
Var
a,b,c,d,i:Integer;
x:Array [1..1000] Of Integer;
Begin
i:=0;
Repeat
Readln(a,b,c,d);
If a=-1 Then Break;
i:=i+1;
x[i]:=(5544*a+14421*b+1288*c) Mod 21252-d;
If x[i]<=0 Then x[i]:=x[i]+21252;
Until False;
For a:=1 To i Do
Writeln('Case ',a,': the next triple peak occurs in ',x[a],' days.');
End.
而这个是错误的(入一组出一组):
Var
a,b,c,d,i,x:Integer;
Begin
Assign(Input,'PKU1006.in');
Assign(Output,'PKU1006.out');
Reset(Input); Rewrite(Output);
i:=0;
Repeat
Readln(a,b,c,d);
If a=-1 Then Break;
i:=i+1;
x:=(5544*a+14421*b+1288*c) Mod 21252-d;
If x<=0 Then x:=x+21252;
Writeln('Case ',a,': the next triple peak occurs in ',x,'
days.');
Until False;
Close(Input); Close(Output)
End.
可以在电脑上运行一下。
如果还有不明白的,可以给我发送消息,或者发邮件:
1151212428@qq.com
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator