1

そのため、私はこの関数を codechef の問題に対してかなり長い間使用してきましたが、現在は整数の高速入力方法として使用しています。

私の質問は、これが実際にどのように機能するか、fgetc_unlocked(stdin) とは何ですか (コメントされていますが)、そして最も重要なのは、それを最適化して長く長く実行するにはどうすればよいかということです。

コードは次のとおりです。

inline void Scan_f(int a)
{
char c = 0;
while(c<33)//shouldn't value of c to compare be less than 9 as digit vary between 0 to 9?? 
//c = fgetc_unlocked(stdin);
c = getc(stdin);
a = 0;
while(c>33)
{
a = a*10 + c - '0';
//c = fgetc_unlocked(stdin);
c = getc(stdin);
}
4

1 に答える 1

2

コードは次のようになります。

inline unsigned long long Scan_f()
{
    int c;
    do
        c = fgetc(stdin);
    while ( (c < '0' || c > '9') && c != EOF );

    unsigned long long a = 0;
    while ( c >= '0' && c <= '9' )
    {
        a = a*10 + (c - '0');
        c = fgetc(stdin);
    }
    return a;
}

あなたが投稿したコードでは、aは値によって渡されるパラメーターであるため、呼び出し元の関数が への変更をどのように検出するかは不明aです。

このfgetc_unlocked関数は、 のより高速なバージョンであると想定されていますfgetc。これは GNU 拡張機能です。

a解析で負の値を取得することはできないため、符号付きの型であることは意味がありません。

このバージョンはオーバーフローをチェックしません。その可能性を処理したい場合は、実行する前にチェックを追加する必要がありますa = a*10

etc. セクションの効率について心配する必要はありませんc < '0'。コンパイラーは既に最適なコードを生成します。彼らは、このような単純な状況をうまく処理できます。確かに、入力ストリームが何であれ、文字を読み取るよりも速くチェックできます。入力ストリームの速度がボトルネックになります。

于 2014-04-07T05:43:06.700 に答える