更新时间:2023-11-17 23:26:52
版本1:使用 getchar_unlocked
作为R塞缪尔Klatchko(见注释)建议
Version 1 : Using getchar_unlocked
as suggested by R Samuel Klatchko (see comments)
#define BUFSIZE 32*1024
int main(){
int lines, number=0, dividend, ans=0;
char c;
setvbuf(stdin, (char*)NULL, _IOFBF, 0);// full buffering mode
scanf("%d%d\n", &lines, ÷nd);
while(lines>0){
c = getchar_unlocked();
//parse the number using characters
//each number is on a separate line
if(c=='\n'){
if(number % dividend == 0) ans += 1;
lines -= 1;
number = 0;
}
else
number = c - '0' + 10*number;
}
printf("%d are divisible by %d \n", ans, dividend);
return 0;
}
版本2:使用 FREAD
来读取它的块和解析数
#define BUFSIZE 32*1024
int main(){
int lines, number=0, dividend, ans=0, i, chars_read;
char buf[BUFSIZE+1] = {0}; //initialise all elements to 0
scanf("%d%d\n",&lines, ÷nd);
while((chars_read = fread(buf, 1, BUFSIZE, stdin)) > 0){
//read the chars from buf
for(i=0; i < chars_read; i++){
//parse the number using characters
//each number is on a separate line
if(buf[i] != '\n')
number = buf[i] - '0' + 10*number;
else{
if(number%dividend==0) ans += 1;
lines -= 1;
number = 0;
}
}
if(lines==0) break;
}
printf("%d are divisible by %d \n", ans, dividend);
return 0;
}
结果:(10万个号码由11整除测试)
Results: (10 million numbers tested for divisibility by 11)
运行1:(不setvbuf用来第1版)0.782秒结果
运行2:(与setvbuf用来版本1)0.684秒结果
运行3:(第2版)0.534
Run 1: ( Version 1 without setvbuf ) 0.782 secs
Run 2: ( Version 1 with setvbuf ) 0.684 secs
Run 3: ( Version 2 ) 0.534
P.S。 - 每次运行使用-O1标志GCC编译
P.S. - Every run compiled with GCC using -O1 flag