所以我已经将这个函数用于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);
}
在我看来,代码应该是:
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
之前添加检查。
不用担心c < '0'
等部分的效率,编译器已经为您生成最佳代码。他们可以很好地处理这样的简单情况。当然,它可以比从输入流中读取字符的速度更快;输入流速度将是瓶颈。