对拍的作用:产生有差异的数据(hack data?)
当你自己的代码和可以AC的代码对样例都能过,但是你代码却不能AC时
就需要随机的产生一些数据,同时对你的代码和AC的代码进行输入,并且比较输出的数据。
如果输出的不一样,就产生了有差异的数据(hack data?)
下面所说的exe文件就是cpp文件编译成功后的文件,exe在cpp的源文件夹里面。
- 一个利用随机数产生数据的exe文件 命名为rand.exe
#include<bits/stdc++.h>
using namespace std;
int main()
{
srand(time(0));
int n=1e8;//这里写题目给的输入数据范围,保证你的数据不会超范围
printf("%d", rand() % n);
//这里print的是要测试的数据,题目输入一个print一个,题目输入一组就print一组
return 0;
}
- 你的代码产生的exe文件 文件命名 my.exe
#include<iostream>
#include<algorithm>
typedef long long ll;
using namespace std;
ll exchange(ll star)
{
if (star < 5)
return 0;
else
return exchange(star / 50 * 3 + star % 5) + star / 5;
}
int main()
{
ll x = 0, star = 0, x_num = 0;
cin >> x;
x_num = x / 160;
star = x_num / 10 * 3;
printf("%lld", x_num + exchange(star));
}
- AC代码的exe文件 文件命名为 std.exe
#include<iostream>
#include<algorithm>
using namespace std;
int x;
int sum;
int main()
{
cin >> x;
int t1 = x / 160;
sum = t1;
int t2 = (t1 / 10) * 3;
while (t2 >= 5 || t1 >= 10)
{
sum += t2 / 5;
t1 = t1 % 10 + t2 / 5;
t2=t2%5+ (t1 / 10) * 3;
}
cout << sum << endl;
}
- 写一个duipai.bat。可以新建一个txt文件,把下面的代码贴进去,然后把后缀名改了
@echo off
:loop
rand.exe>data.in
std.exe<data.in>std.out
my.exe<data.in>my.out
fc my.out std.out
if not errorlevel 1 goto loop
pause
goto loop
-
上面exe前是文件名,可以自行修改。
-
然后把上面涉及到的所有文件,放到同一个文件夹下,运行bat文件
bat正确运行的结果
会在当前文件夹下产生hack data
好像没啥了。。。
剩下的想起来在补充好了
这是测试代码对应的题目,一递归写法有地方不对(用对拍测出来的,因为oj关了),实在看不出来
while循环是能AC掉的(OJ当初交的能过)。
巨巨,假设造的数据,是一个多组。 那么对拍出来差异后,能直接在那组中准确返回那个错误数据吗?
感觉很不错