想出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;
}

是不是很短?(无论是头文件还是主程序,它很简洁……所以能用的功能也很少。)
它的作用是生成下面这道题的数据文件:
输入正整数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;
}
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值