这段代码是如何像快速i/o一样运行的?
How does this piece of code function as fast i/o?
我无法理解这个函数如何在c++中导致更快的I/o。请帮帮我!!
#include <iostream>
#include <cstring>
#define FOR(A,B,C) for(int A=B;A<C;A++)
#define EFOR(A,B,C) for(int A=B;A<=C;A++)
#define RFOR(A,B,C) for(int A=B;A>=C;A--)
using namespace std;
inline void Input(int &N)
{
int ch;
N=0;
while((ch<'0'||ch>'9')&&ch!='-'&&ch!=EOF)
ch=getchar();
do
N=(N<<3)+(N<<1)+(ch-'0');
while( (ch=getchar())>='0' && ch<='9');
return;
}
int main()
{
unsigned int fn[100005],gn[100005];
fn[0]=1,gn[0]=1,fn[1]=1,gn[1]=0;
int MOD=100000;
EFOR(fill,2,100001){
fn[fill]=(fn[fill-1]+fn[fill-2]+2*gn[fill-1])%MOD;
gn[fill]=(fn[fill-2]+gn[fill-1])%MOD;
}
int T;
Input(T);
while(T--){
int N;
Input(N);
printf("%un",fn[N]%10000);
}
return 0;
}
这段没有内联函数的代码得到了TLE,但是有了它,它得到了AC如果我只使用cin或scanf来获取输入,我会得到一个TLE
假设第一行为:int ch = getchar();
while((ch<'0'||ch>'9')&&ch!='-'&&ch!=EOF)
ch=getchar();
这些行跳过所有非数字的字符。虽然你应该正确使用-
。
(N<<3)+(N<<1)
相当于N * 8 + N * 2
或N * 10
。
(ch-'0')
将字符ch
从可打印字符转换为数字。
添加到之前的结果10 * N
将新读取的字符附加到n
它可能比使用cin
或printf("%d", &N)
格式化的输入更快,原因如下:
- 读取原始输入而不是格式化。
- 使用移位的乘法
代码跳过所有非数字字符,然后读取所有数字并将它们累加成一个数字。
N=(N<<3)+(N<<1)+(ch-'0');
是
的优化N = N*10+(ch-'0')
在大多数编译器/平台上是完全没有必要的。
bug和可移植性问题:
- ch未初始化
- 输入'-'以N=0结束输入。这可能不是有意的
相关文章:
- 运行同一解决方案的另一个项目的项目
- CMake-按正确顺序将项目与C运行时对象文件链接
- 如何运行位于boost/libs/python/example/tutorial目录中的hello.cpp和Jamfil
- 代码在main()中运行,但在函数中出现错误
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为什么在运行时没有向我们提供有关分段错误的更多信息?
- 如何在运行中期切换GTK CSS style_context
- 如何在MS Visual Studio 2019中运行QT UI
- 如何通过cpp程序运行shell脚本
- IPC使用多个管道和分支进程来运行Python程序
- 删除指向指针的指针是运行时错误吗
- 如何用参数值调用函数(仅在运行时已知)
- 为什么即使使用-cudart-static进行编译,库用户仍然需要链接到cuda运行时
- 如何在Powershell中运行C++程序,就像CMD一样?
- 如何在运行时像可执行文件一样"启动"DLL?
- 是一个 for 循环,最终甚至不会运行一次,就像调用 if 语句以首先检查大小一样快
- 是否可以像Java一样在VM中运行,从而使C++平台独立
- 从vi运行各种c或cpp开发任务"就像在不退出vi的情况下运行cpp程序一样。
- 这段代码是如何像快速i/o一样运行的?