想出OI题?用最简洁的C/C++测试数据生成工具——makedata.h库

我一直觉得出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;
}

是不是很短?(无论是头文件还是主程序,它都比CarYon简洁得多。)
它的作用是生成下面这道题的数据文件:
输入正整数a,求2*a的值(1<=a<=10)。
那么,效果究竟怎么样呢?
在这里插入图片描述
绝了吗?绝了!

基本使用方法

修改测试点数目

times=你要的测试点数目;

输出当前测试点编号

cout<<tp<<endl;

写入数据到输入文件

infile<<数据<<endl;

写入数据到输出文件

outfile<<数据<<endl;

生成(a,b)区间的随机数

变量名=num(a,b);

使用样例

洛谷U125097 阶乘之和-大数取模

#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;
}

猜你喜欢

转载自blog.csdn.net/tkzlfg/article/details/111071467