此贴参考了造数据-ACGO题库|信息学竞赛OJ刷题平台 帖子
一、准备工作
首先需要三个文件:
-
pi.cpp:标准程序(保证正确的代码) -
data.cpp:数据生成器(随机生成输入数据) -
duipai.cpp:批量生成器(批量生成 .in 和 .out 文件)
还要准备Dev-C++软件
二、三个文件的写法
1. pi.cpp(标程)
#include<bits/stdc++.h>
using namespace std;
int main(){
// 这里放你确定能AC的代码
// 注意:代码必须正确,不然造出来的.out文件也是错的
return 0;
}
2. data.cpp(数据生成器)
#include<bits/stdc++.h>
using namespace std;
int main(){
// 用时间做种子,保证每次运行生成的数据不一样
srand(time(0));
// 生成n,范围根据题目来改
// 如果题目n<=100000,这里就写100000
int n=rand()%100000+1;
cout<<n<<"\n";
// 生成n个数
for(int i=1;i<=n;i++){
// 生成1~1e9的随机数
int x=rand()%1000000000+1;
cout<<x<<" ";
}
cout<<"\n";
return 0;
}
3. duipai.cpp(批量生成器)
#include<bits/stdc++.h>
#include<windows.h> // Sleep函数要用
using namespace std;
void solve(int x){
// 把数字转成字符串,用来当文件名
string p;
int now=x;
while(now){
p+=char((now%10)+'0');
now/=10;
}
reverse(p.begin(),p.end());
// 【重要】把路径改成你自己的
// 如果用户名是zhangsan,就改成zhangsan
string dir="C:\\Users\\你的用户名\\Desktop\\data\\";
// 生成.in文件
string in=dir+p+".in";
string command1="data.exe > "+in;
cout<<command1<<"\n";
system(command1.c_str());
// 生成.out文件
string out=dir+p+".out";
string command2="pi.exe < "+in+" > "+out;
cout<<command2<<"\n";
system(command2.c_str());
}
int main(){
int t;
cin>>t; // 输入要生成几组数据
for(int i=1;i<=t;i++){
Sleep(50); // 等50毫秒,防止随机数一样
solve(i);
}
system("pause");
return 0;
}
三、操作步骤
第1步: 在桌面建一个文件夹,名字叫 data
第2步: 把上面三个.cpp文件放进去
第3步: 编译 pi.cpp,生成 pi.exe
第4步: 编译 data.cpp,生成 data.exe
第5步: 编译 duipai.cpp,生成 duipai.exe
第6步: 双击 duipai.exe,输入数字(比如10),回车
第7步: 打开 data 文件夹,就能看到 1.in、1.out、2.in、2.out……
四、需要改的地方
| 文件 | 改哪里 | 改成啥 |
|---|---|---|
pi.cpp |
整个代码 | 换成你自己的正确代码 |
data.cpp |
rand()%100000+1 |
题目数据范围 |
data.cpp |
输出内容 | 题目输入格式 |
duipai.cpp |
你的用户名 |
你自己的Windows用户名 |
五、常见问题
1. 双击exe闪退?
在 duipai.cpp 最后一行写了 system("pause") 就不会闪退了
2. 生成的文件是空的?
先检查 data.exe 和 pi.exe 有没有生成,没生成的话重新编译
3. 生成的数据都一样?
把 Sleep(50) 改成 Sleep(200),等久一点
4. 路径找不到?
确认桌面有 data 这个文件夹,确认路径里的用户名是你自己的
5. 随机数不够大?
用 (rand()<<15)|rand() 代替 rand(),比如:int x=((rand()<<15)|rand())%1000000000+1;
制作不易,能评个小小的分再走吗😭?



