当我们写出一个解决某个问题的高端算法后不清楚自己写的是否正确,而我们又能想到一种暴力做法,这个时候我们可以让两个程序对拍,判断自己写的是否正确。
这里我们以洛谷P2152 SuperGCD为例,当我们写出了高精的做法又不敢确定是否写对时,我们可以写一下long long类型的普通gcd(当然前提是你这个不能写错)。然后将两个程序进行对拍,这里给出对拍的代码
@echo off
:loop
data.exe
std.exe
test.exe
fc std.out test.out
if not errorlevel 1 goto loop
pause
goto loop
其中test代表你想要测试的那份代码,std代表你写的一定正确的暴力算法,而data就是我们要随机生成的数据,这里的意思就是随机生成数据后给两份代码都测,然后回到out文件,如果一样就返回一开始再生成随机数,否则就暂停。当我们随机生成了许多组数据结果都一样时,这个时候我们就可以基本确定这份代码是正确的了。
还是以SuperGCD为例,这里给出std程序
#include<cstdio>
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
ll m,n;
ll gcd(ll a,ll b)
{
if(b==0) return a;
return gcd(b,a%b);
}
int main()
{
freopen("data.in","r",stdin);
freopen("std.out","w",stdout);
cin>>m>>n;
cout<<gcd(m,n);
fclose(stdin);
fclose(stdout);
return 0;
}
注意到输入输出文件,要调用的是data.in。
同样的对于我们想要测试的那份代码,也要加上文件输入输出,只不过将std.out换成test.out(当然名字是自己定的)。这里就不放代码了(因为有错。。。)
然后我们就需要写data.cpp,随机生成数据。由于这个题要测试的数据是两个数,所以我们可以写的不是那么复杂。不过要注意我们rand()生成的其实是个伪随机数,自己还要赋予其一个种子才能生成真正意义上不同的随机数,而赋予的种子又不能一样,所以我们可以用系统时间time(0)作为种子,因为系统时间每时每刻都不一样。这样之后我们就可以得到两个随机数了。不过这道题是求gcd,而你随便生成两个数很有可能其gcd就是1,所以我们将其%1000+1 (相当于控制范围在1-1000之间),然后乘另外两个随机数,答案就很有可能是a了,这样对拍出来的结果也更有把握。写出这份代码后,我们将三份代码都运行。对于我们之前写的对拍的代码(就是一开始的那个),我们将其存在文本文档里,保存,然后修改其文件类型为bat。这样之后我们再双击这个文件,不出意外地话就会输出两份代码比较结果是否相同了。
#include <cstdio>
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
int main()
{
freopen("data.in","w",stdout);
srand(time(0));
int a=rand()%1000+1;
int b=rand()%1000+1;
int c=rand()%1000+1;
cout<<a*b<<endl<<a*c;
fclose(stdout);
return 0;
}