这段代码如何像快速i / o一样运行?

时间:2015-07-29 15:06:00

标签: c++ io

我无法理解这个函数如何在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("%u\n",fn[N]%10000);
}

return 0;
}

这个没有内联函数的代码正在获得TLE,但有了它,它就变成了AC 如果我只使用cin或scanf来获取输入,那么我将获得TLE

2 个答案:

答案 0 :(得分:0)

假设第一行是:protected void configure(HttpSecurity http) throws Exception { http .authorizeRequests() .antMatchers("/resources/**", "/signup", "/about").permitAll() .antMatchers("/admin/**").hasRole("ADMIN") .antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')") .anyRequest().authenticated() .and() // ... .formLogin(); }

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会将新读取的字符附加到N。

由于以下原因,它可能比使用10 * Ncin的格式化输入更快:

  • 读取原始输入而不是格式化。
  • 使用移位的乘法

答案 1 :(得分:0)

代码跳过所有非数字字符,然后读取所有数字并将它们累积为数字。

N=(N<<3)+(N<<1)+(ch-'0');

的优化
N = N*10+(ch-'0')

这在大多数编译器/平台上都是完全不必要的。

错误和可移植性问题:

  • ch未初始化
  • 进入&#39; - &#39;以N = 0结束输入。这可能不是打算