-3

プログラミングの質問に1から10000の範囲の数値を大量に入力する必要があります。質問は、高速I/O方式を使用するようにアドバイスします。

競技プログラミングで高速入出力を見ました が、複雑すぎました。だから誰かが私に速いioを取得するためのより簡単な方法を教えてもらえますか?

また、数字を入力として使用するよりも、使用してgetsから実行atoi()する方が速いかどうかを教えてください 。scanf(%d)

4

4 に答える 4

3

あなたの質問の 2 番目の部分に答えるために、私にとってatoiは、約 2 倍の速さのようです。次の点を考慮してください。

#define ITERS 1000000

clock_t testAtoi()
{
    char buffer[64];
    clock_t start = clock();

    for (int i = 0; i < ITERS; i++) {
        sprintf(buffer, "%i", i);
        int l = atoi(buffer);
    }

    return clock() - start;
}

clock_t testScanf()
{
    char buffer[64];
    clock_t start = clock();

    for (int i = 0; i < ITERS; i++) {
        sprintf(buffer, "%i", i);
        int l = 0;
        sscanf(buffer, "%i", &l);
    }

    return clock() - start;
}

int main()
{
    printf("clocks for atoi: %lu\n", testAtoi());
    printf("clocks for sscanf: %lu\n", testScanf());

    return 0;
}

私の場合、gcc を使用して-O0(私の変数は最適化されていません)、プログラムは次のように出力します。

atoi のクロック: 222011
sscanf のクロック: 392409

ただし、を使用している場合はFILE *、おそらくfscanfより高速になります。現時点では 2 つを比較する時間はありませんが、生の文字列の場合atoiは、ほとんどの場合に使用します。

于 2012-05-26T01:39:35.637 に答える
-1

C/C++ には FASTIO 用の特別なライブラリはありません。

C/C++ で出力を印刷する最速の方法は、stdio.h ライブラリの fwrite または fwrite_unlocked です。

また、出力を一度に印刷するための特別な/直接的な機能はありません。

間接的には、cplusplus の append 関数 (すべての出力文字列を 1 つの文字列に追加し、最終的な文字列を出力する) を使用して実現できます。 、printfよりもはるかに遅いです。

したがって、c/c++ での最速の方法は、生の形式でストリームを直接読み取り、必要な情報を抽出することです。また、出力を生の形式で巨大なバッファーに入れ、最後に fwrite を使用して表示します。

そして、高速 IO については、このリンクのソリューションを試してみてください。(http://www.codechef.com/viewsolution/244848)

于 2012-05-30T04:31:07.723 に答える