我最近了解到,使用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()?等等.. 如果有人为我详细说明这将是很大的帮助。提前致谢!
答案 0 :(得分:0)
好的,因为您的要求需要清楚地说明,所以我在这里写它...因此,我不会在评论中把它弄乱了...
函数:(对其进行了一些编辑以使其看起来更像 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 Table,因为如果您不了解结果,您将不知道结果如何。
1)在这里,您有一个字符ch
使用getchar_unlocked()
占据了用户的输入字符(auto关键字会自动为您完成此操作并且仅在C ++中可用,而在C中不可用...
2)您将变量 number 分配为零,以便可以重复使用该变量,请注意,该变量是一个引用,因此它会在程序内部更改为好吧...
3) while (ch >= '0' && ch <= '9')
...如前所述,检查字符是否在ASCII数字限制内,类似于说该字符必须大于或等于48。但小于或等于57 ...
4)在这里,有些棘手,将变量 number 与自身乘以10以及所存储字符的实整数值相乘) ...
5)在下一行,重新分配了 ch ,这样您就不必永远停留在循环中,因为如果ch永远保持该数字,用户没有输入任何内容...请记住,循环返回到结束后声明的位置,检查条件是否为真,继续,如果条件为真,则中断)。
在这里,ch首先需要4,然后其他人跟随,所以我们首先选择4 ...
1) 数字将分配为零。 while循环检查给定字符是否为数字,如果继续,则循环将其中断...
2 ) 0与10的乘积将为零 ... 并将其与48的差52(即'4'
)相加(即'0'
)为您提供4 (实际数值,而不是char '4'
)...
所以变量数现在是4 ...
其他情况也是如此...请参阅...
number = number * 10 + '5' - '0'
number = 4 * 10 + 53 - 48
number = 40 + 5
number = 45... etc, etc. for other numbers...