我一直觉得出OI题是件快乐的事,但造数据、敲std是件麻烦的事。
于是,我写下了这样两段代码……
//makedata.h 2020.12.15
#include<bits/stdc++.h>
using namespace std;
ofstream infile,outfile;
int times=10;
void file(int tp){
char inname[10],outname[11];
infile.close();
outfile.close();
sprintf(inname,"data%02d.in",tp);
sprintf(outname,"data%02d.out",tp);
infile.open(inname);
outfile.open(outname);
}
#define num(a,b) ((rand()*RAND_MAX+rand())%(a-b+1)+a)
int make(int tp);
int main(){
srand(time(0));
for(int tp=1;tp<=times;++tp){
file(tp);
make(tp);
}
return 0;
}
//main.cpp 2020.12.13
make(int tp){
infile<<tp;
outfile<<2*tp;
}
是不是很短?(无论是头文件还是主程序,它很简洁……所以能用的功能也很少。)
它的作用是生成下面这道题的数据文件:
输入正整数a,求2*a的值(1<=a<=10)。
那么,效果究竟怎么样呢?
绝了吗?绝了!
基本使用方法
修改测试点数目
times=你要的测试点数目;
输出当前测试点编号
cout<<tp<<endl;
写入数据到输入文件
infile<<数据<<endl;
写入数据到输出文件
outfile<<数据<<endl;
生成[a,b]区间的随机数
变量名=num(a,b);
使用样例
#include"makedata.h"
make(int tp){
times=50;
int n=num(1,1000000000),m=num(1,1000000000),ans=0;
cout<<"Testpoint"<<tp<<":n="<<n<<",m="<<m<<endl;
long long now=1;
for(int i=1;now&&i<=n;i++){
now*=i;
now%=m;
ans+=now;
ans%=m;
}
infile<<n<<" "<<m;
outfile<<ans;
}