在C中快速输入长和长?

时间:2014-04-07 03:35:28

标签: c input long-integer long-long large-data

所以我一直在使用这个函数来解决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);
}

1 个答案:

答案 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'等部分的效率,编译器会为您生成最佳代码。他们可以很好地处理这样的简单情况。当然,它可以检查它比从输入流中读取的字符更快;输入流速将成为瓶颈。