我需要在编程问题中输入 1 到 10000 范围内的大量数字。问题建议使用快速 I/O 方法。
我在竞争性编程中查看了快速输入/输出, 但它太复杂了。所以任何人都可以告诉我一个更简单的方法来获得快速 io。
另外请告诉我使用 gets
然后做atoi()
是否比使用scanf(%d)
数字作为输入更快。
要回答你问题的第二部分,对我来说,这似乎atoi
快了两倍。考虑以下:
#define ITERS 1000000
clock_t testAtoi()
{
char buffer[64];
clock_t start = clock();
for (int i = 0; i < ITERS; i++) {
sprintf(buffer, "%i", i);
int l = atoi(buffer);
}
return clock() - start;
}
clock_t testScanf()
{
char buffer[64];
clock_t start = clock();
for (int i = 0; i < ITERS; i++) {
sprintf(buffer, "%i", i);
int l = 0;
sscanf(buffer, "%i", &l);
}
return clock() - start;
}
int main()
{
printf("clocks for atoi: %lu\n", testAtoi());
printf("clocks for sscanf: %lu\n", testScanf());
return 0;
}
对我来说,使用 gcc 和-O0
(所以我的变量没有被优化掉),程序输出:
atoi 时钟:222011
sscanf 时钟:392409
但是,如果您使用的是FILE *
,那么可能fscanf
会更快。我现在没有时间比较这两者,但对于原始字符串,我只会使用atoi
大部分。
没有用于快速输入/输出的特定库。您可以关闭同步,这将一起输入并一起打印输出。
在 main() 中添加以下代码行以关闭同步:
int main(){
ios_base::sync_with_stdio(0);
cin.tie(0);
// Your code ................
}
C/C++ 中没有任何用于 FASTIO 的特殊库。
在 C/C++ 中打印输出的最快方法是 stdio.h 库中的 fwrite 或 fwrite_unlocked。
也没有任何特殊/直接功能可以一次打印输出。
间接地,可以使用 cplusplus 中的 append 函数(将所有输出字符串附加到一个字符串并打印最终字符串)甚至 string.h lib 中的 strcat 函数来实现,但性能方面,“Appending or concat + printing”速度较慢,甚至比 printf 慢得多。
所以c/c++中最快的方法是:直接以原始形式读取流,并提取所需的信息。还将原始形式的输出放在一个巨大的缓冲区中,最后使用fwrite显示出来。
请尝试通过此链接中的解决方案进行快速 IO。(http://www.codechef.com/viewsolution/244848)
参考这篇博客:http ://bugdivine.blogspot.com/p/fast-input-reader-in-cc.html
在 C/C++ 中获取输入的最快方法是从输入缓冲区读取每个字符并将它们推送到结果变量中,直到到达分隔符。
然而,scanf 也非常快,即使在竞争性编程世界中,我们必须使用 getchar_unlocked 的情况也很少发生。