对拍
对拍是干什么的呢?就是当你在考场上还剩下很多时间,但是你又不知道你打的程序是不是正解,有没有打错细节,那么这时候就可以用对拍来搞一搞。
举个例子
比如说这是我在考场上打的一个程序(求
12+22+......n2
的值)
自认为是正解的程序。
pascal选手看这里(a.pas)
var
n:longint;
begin
readln(n);
writeln(n*(n+1)*(2*n+1) div 6);
end.
c++选手看这里(a.cpp)
#include<cstdio>
int main()
{
int n;
scanf("%d",&n);
printf("%d",n*(n+1)*(2*n+1)/6);
}
又假设我写了这样一个暴力,
pascal:(b.pas)
var
n,sum,i:longint;
begin
readln(n);
for i:=1 to n do
begin
sum:=i*i+sum;
end;
writeln(sum);
end.
c++(b.cpp)
#include<cstdio>
int main()
{
int i,n;
long int sum = 0;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
sum += i*i;
}
printf("%d\n",sum);
return 0;
}
然后还有一个出数据的程序
pascal:(data.pas)
var
n:longint;
begin
randomize;
writeln(random(100));
end.
c++:(data.cpp)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main()
{
int n;
srand((int)time(0)); //调用srand()函数,以系统时间为随机种子
n = 1 + rand()%100; //随机生成一个1到100的自然数
printf("%d\n",n); // 输出随机生成的自然数
return 0;
}
然后将上面的三个程序编译运行,生成exe可执行文件。
然后将这三个exe可执行文件放入同一个文件夹中。接下来我们就需要另一个奇妙的东西
@echo off
:loop
data.exe>data.in
b.exe<data.in>b.out
a.exe<data.in>a.out
fc a.out b.out
if not errorlevel 1 goto loop
pause
goto loop
首先把这个玩意放在judge.txt中(当然你也可以不用judge,叫其他名字都可以),注意judge.txt要和上面三个exe可执行文件放在一起,然后将judge.txt的扩展名该为bat,然后点击打开judge.bat即可。
如果发现错了怎么办,可以发现在这个文件夹中有一个data.in文件就是用来记录每一次data.exe生成的数据。然后直接用data.in中的数据进行调试即可。从a.in和b.in中分别看错误的答案正确的答案,若要将a.exe改为其它的,只需将上面的代码改成这样,假设将a改为c。
@echo off
:loop
data.exe>data.in
b.exe<data.in>b.out
c.exe<data.in>c.out
fc c.out b.out
if not errorlevel 1 goto loop
pause
goto loop
the end
由于我实在是太垃圾了,难免会写错,希望大家批评指正,多多包容,thank you for your patience.