1. 程式人生 > >windows和linux下如何對拍

windows和linux下如何對拍

問題 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下如何對拍