C语言中的长和长输入



所以我已经将这个函数用于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'等部分的效率,编译器已经为您生成最佳代码。他们可以很好地处理这样的简单情况。当然,它可以比从输入流中读取字符的速度更快;输入流速度将是瓶颈。

相关内容

  • 没有找到相关文章

最新更新