プログラミングの質問に1から10000の範囲の数値を大量に入力する必要があります。質問は、高速I/O方式を使用するようにアドバイスします。
競技プログラミングで高速入出力を見ました が、複雑すぎました。だから誰かが私に速いioを取得するためのより簡単な方法を教えてもらえますか?
また、数字を入力として使用するよりも、使用してgets
から実行atoi()
する方が速いかどうかを教えてください 。scanf(%d)
プログラミングの質問に1から10000の範囲の数値を大量に入力する必要があります。質問は、高速I/O方式を使用するようにアドバイスします。
競技プログラミングで高速入出力を見ました が、複雑すぎました。だから誰かが私に速いioを取得するためのより簡単な方法を教えてもらえますか?
また、数字を入力として使用するよりも、使用してgets
から実行atoi()
する方が速いかどうかを教えてください 。scanf(%d)
あなたの質問の 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
は、ほとんどの場合に使用します。
C/C++ には FASTIO 用の特別なライブラリはありません。
C/C++ で出力を印刷する最速の方法は、stdio.h ライブラリの fwrite または fwrite_unlocked です。
また、出力を一度に印刷するための特別な/直接的な機能はありません。
間接的には、cplusplus の append 関数 (すべての出力文字列を 1 つの文字列に追加し、最終的な文字列を出力する) を使用して実現できます。 、printfよりもはるかに遅いです。
したがって、c/c++ での最速の方法は、生の形式でストリームを直接読み取り、必要な情報を抽出することです。また、出力を生の形式で巨大なバッファーに入れ、最後に fwrite を使用して表示します。
そして、高速 IO については、このリンクのソリューションを試してみてください。(http://www.codechef.com/viewsolution/244848)