1. 程式人生 > >信息學競賽中的讀入比較與其他讀入方法

信息學競賽中的讀入比較與其他讀入方法

信息 32位系統 cin def 時間 fread tdi fine with

目錄

  • 註意事項
  • 輸入輸出時間測試

註意事項

讀入註意這幾點

  • 如果關閉同步:ios::sync_with_stdio(false)
    那麽cin和scanf不能混用.
  • 不同系統下的longlong讀入不一樣.32位系統與64位系統longlong讀入(或輸出)時的格式不一樣,32位系統下的讀入(輸出)是printf("%I64d,*x);
    而64位的是scanf("%lld",&x);
    而我們可以這樣.
### scanf
ifdef WIN32
#define LL "%64d"
#else
#define LL "%lld"
#endif

讀入(輸出)的時候
直接scanf(LL,&x)
是不是很好用,當然我們完全可以使用cin,cout.(未關閉同步的cin,cout異常慢)

輸入輸出時間測試

1e7的數據 :cin 12.13
scanf 9.718
read 2.996
cout 20.91
printf 30.35
關閉同步後的cin 2.18
puts 1.47秒
不過我發現還是輸入read,輸出puts快.
以及具有非常快的速度的輸入.時間是scanf的\(1/10\)

const int BUF_SIZE = 30;
char buf[BUF_SIZE], *buf_s = buf, *buf_t = buf + 1;
#define PTR_NEXT()     {         buf_s ++;         if (buf_s == buf_t)         {             buf_s = buf;             buf_t = buf + fread(buf, 1, BUF_SIZE, stdin);         }     }
#define readint(_n_)     {         while (*buf_s != '-' && !isdigit(*buf_s))             PTR_NEXT();         bool register _nega_ = false;         if (*buf_s == '-')         {             _nega_ = true;             PTR_NEXT();         }         int register _x_ = 0;         while (isdigit(*buf_s))         {             _x_ = _x_ * 10 + *buf_s - '0';             PTR_NEXT();         }         if (_nega_)             _x_ = -_x_;         (_n_) = (_x_);     }

信息學競賽中的讀入比較與其他讀入方法