所以我一直在使用这个函数来解决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);
}
答案 0 :(得分: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
之前你需要添加一个支票。
不要担心c < '0'
等部分的效率,编译器会为您生成最佳代码。他们可以很好地处理这样的简单情况。当然,它可以检查它比从输入流中读取的字符更快;输入流速将成为瓶颈。