почему этот код C / C ++ помогает в быстром вводе - PullRequest
0 голосов
/ 21 мая 2019

Я взял этот код по этой ссылке https://www.codechef.com/viewsolution/1715623 и я не могу понять, как функция scan () помогает в быстром вводе

#define g getchar_unlocked()
int scan()//fast input output
{
    int t=0;
    char c;
    c=g;
    while(c<'0' || c>'9')
        c=g;
    while(c>='0' && c<='9')
    {
        t=(t<<3)+(t<<1)+c-'0';
        c=g;
    }//end fast input output
    return(t);
}

Ответы [ 2 ]

2 голосов
/ 21 мая 2019

Определяемая пользователем функция scan() использует функцию lib getchar_unlocked(), которая быстрее, чем getchar(), и любые другие стандартные методы ввода, поскольку не безопасен для потоков .

Внутренние функциональные циклы используются для учета только числового ввода (и используют операторы сдвига вместо умножения для дополнительного прироста производительности, который должен быть проверен перед использованием).

И эта функция содержит возможные переполнения int.

1 голос
/ 21 мая 2019

Я думаю, что это в основном atoi с getchar. Он игнорирует начальные нечисловые символы, а затем создает целое число из строковых чисел, выходя из него, когда числовые числа заканчиваются. Сканирование, вероятно, не подходит для этого, оно должно быть Atoi () или ScanNum ()? Вероятно, не работает, когда целое число большое из-за проблем с переполнением целых чисел.

Я бы удивился, если бы это было быстрее, чем atoi (), не уверен, почему они тоже не использовали isdigit ().

В отличие от кода Калифорнийского университета, он не проверяет наличие признаков и не использует ключевое слово register.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...