windows和linux下如何對拍
阿新 • • 發佈:2019-02-16
問題 getch open \n system noi ret 而在 分享
對拍是各種計算機考試檢查時必備工具,實際上十分強大,只要你的暴力沒有寫錯就沒有問題。
對拍的意思:(怎麽有點語文課的意思霧)
對:看見‘對’就可以知道有兩個。
拍:就是把兩個程序結果拍在一起,對照(有點牽強)。
實踐
由於Windows和Linux系統不同,平常大多數人都用Windows,而在noi系列賽事中都采用Linux系統。
Windows
就以a+b為例吧。
首先擺一個可能是正解的東西。
這個代碼文件名:1.cpp
#include<cstdio> #include<windows.h> #include<ctime> #include<cstdlib> using namespace std; int main() { int a,b; scanf("%d%d",&a,&b); for(int i=1;i<=n;i++)a++,b--; printf("%d\n",a+b); return 0; }
現在擺一個一定是正確的但時間和內存超標的代碼,當然例子沒有超標。
這個代碼文件名:2.cpp
#include<cstdio>
using namespace std;
int main()
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",a+b);
return 0;
}
構造數據。
註意
不能只用rand構造,因為rand表示偽隨機數,在一定基數下一定,所以用rand構造的隨機數出題人也知道你構造的是什麽(然後故意卡你)
所以介紹一個新東西。
#include<ctime>
這個怎麽用???
srand(time(NULL));
這個時候,他的隨機數隨時間變化(笑),出題人再也搞不出來卡你的算法了;
rand要用cstdlib庫
代碼文件名:data.cpp
#include<cstdio>
#include<ctime>
#include<cstdlib>
using namespace std;
int main()
{
srand(time(NULL));
printf("%d %d\n",rand()%1000,rand()%1000);
}
註意換行符必須加,否則你想想手動輸入數據不加換行會怎麽樣。
下面的就是對拍程序:
代碼文件名:duipai.cpp
#include<stdio.h>
#include<time.h>
#include<windows.h>
using namespace std;
int main()
{
int t=1000;//如果不是自己電腦可以無限調大,不過要悠著點(笑)
while(t!=0)
{
clock_t t1,t2;//設時間
system("data.exe>data.txt");//把data文件轉化成txt格式
t1=clock();
system("1.exe<data.txt>1.txt");//把1文件搜如data.txt然後轉化成1.txt
t2=clock()-t1;
system("2.exe<data.txt>2.txt");//把2文件搜如data.txt然後轉化成2.txt
printf("time=%dms\n",t2);//計算時間,可能會大一些
if(system("fc 1.txt 2.txt"))break;//比較1.txt與2.txt不同就跳出
t--;
}
if(t==0)printf("no error\n");
else printf("error\n");
getchar();
return 0;
}
程序運行。
如果程序出錯就在生成的txt文件裏找樣例:
data.txt裏是樣例。1.txt和2.txt是輸出。
Linux系統
這個系統是我不經常接觸的(實際上只在考試接觸),所以如有口胡請見諒,請指出。
還是a+b。(其實Windows也可以這麽搞)
文件名:1.cpp
#include<cstdio>
using namespace std;
int main()
{
freopen("add.in","r",stdin);
freopen("add.out","w",stdout);
int a,b;
scanf("%d%d",&a,&b);
for(int i=1;i<=n;i++)a++,b--;
printf("%d\n",a+b);
return 0;
}
暴力:
文件名:2.cpp
#include<cstdio>
using namespace std;
int main()
{
freopen("add.in","r",stdin);
freopen("add1.out","w",stdout);
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",a+b);
return 0;
}
造數據:
文件名:data.cpp
#include<cstdio>
#include<ctime>
#include<cstdlib>
using namespace std;
int main()
{
freopen("add.in","w",stdout);
srand(time(NULL));
printf("%d %d\n",rand()%1000,rand()%1000);
}
對拍:
文件名:duipai.cpp
#include<bits/stdc++.h>//由於windows.h庫在Linux下不可用,我也不知道system應調用什麽文件,就用萬能頭文件233.
using namespace std;
int main()
{
int t=10;
while(t!=0)
{
clock_t t1,t2;
system("./data");//打開data
t1=clock();
system("./1");//打開文件1
t2=clock()-t1;
system("./2");//打開文件2
printf("time=%dms\n",t2);
if(system("diff add.out add1.out"))break;//比較答案
t--;
}
if(t==0)printf("no error\n");
else printf("error\n");
getchar();
return 0;
}
由於不善於用linux系統,所以沒有留下圖片,抱歉
點擊右下角推薦
評論區可以表白
windows和linux下如何對拍