Использование getchar_unlocked () - PullRequest
0 голосов
/ 20 октября 2018

Я недавно узнал, что использование getchar_unlocked() - более быстрый способ чтения ввода.Я искал в Интернете и нашел фрагмент кода ниже: Но я не могу его понять.

void fast_scanf(int &number)
{
    register int ch = getchar_unlocked();
    number= 0;

    while (ch > 47 && ch < 58) {
        number = number * 10 + ch - 48;
        ch     = getchar_unlocked();
    }
}

int main(void)
{
    int test_cases;fast_scanf(test_cases);

    while (test_cases--) 
   {
        int n;
        fast_scanf(n);
        int array[n];
        for (int i = 0; i < n; i++)
            fast_scanf(array[i]);
    }
return 0;
}

Итак, этот код принимает входные данные для целочисленного массива размером n для заданного числа test_cases.Я ничего не понял в функции fast_scanf, например, почему эта строка:

while (ch > 47 && ch < 58) 
{ number = number * 10 + ch - 48;

почему регистр используется при объявлении ch?

почему getchar_unlocked () используется дваждыв функции?и так далее. Было бы здорово помочь, если бы кто-то разработал это для меня.Заранее спасибо!

1 Ответ

0 голосов
/ 20 октября 2018

Хорошо, поскольку то, что вы просите, должно быть четко объяснено, я пишу это здесь ... так что я не путаю все это в комментариях ...

Функция: (Отредактированонемного, чтобы он выглядел более C ++ - стандарт )

void fast_scanf(int &number)
{
    auto ch = getchar_unlocked();
    number= 0;
    while (ch >= '0' && ch <= '9')
    {
        number = number * 10 + ch - '0';
        ch     = getchar_unlocked();
    }
}

Здесь рассмотрим сначала таблицу ASCII , так как вы выигралине понимаю, как получаются результаты, если вы не ...

1) Здесь у вас есть символ ch принимает входной символ от пользователя с помощью getchar_unlocked() (ключевое слово auto делает это автоматически для вас и может использоваться только в C ++, но не в C) ...

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

3) while (ch >= '0' && ch <= '9') ... Как уже указывалось, проверяется, находятся ли символы в пределах числового предела ASCII, аналогично тому, что символ должен быть большеn или равно 48, но меньше или равно 57 ...

4) Здесь все немного сложнее, переменная число умножается напроизведение самого себя и 10 и действительное целое значение сохраненного вами символа) ...

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


Например: 456764

Здесь ch сначала будет брать 4, а затем остальные, так что мы идем с 4первый ...

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

2 ) Умножение 0 на 10будет равен нулю ... , и сложение с разницей 52 (то есть '4') с 48 (то есть '0') даст вам 4 ( действительное числовое значение, а несимвол '4') ... Таким образом, номер переменной теперь равен 4 ...


И то же самое продолжается и с другими ... См....

number = number * 10 + '5' - '0'

number = 4 * 10 + 53 - 48

number = 40 + 5

number = 45... etc, etc. for other numbers...

...