Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

被总是WA困扰的各位注意了!我有个发现!

Posted by FNOI06BWRWEN at 2010-06-21 19:32:43 on Problem 1006
我一般都是编程序时用文件输入、文件输出(黑盒)的测试方法,提交时再删了。
但是,这里有个问题,用“黑盒”的方法看不出来,竟困扰了我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:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator