gpt4 book ai didi

c - 优化 C 代码中的 I/O(输出)+ 循环

转载 作者:太空狗 更新时间:2023-10-29 15:30:07 26 4
gpt4 key购买 nike

我有一个代码,它从 stdin 读取大约 (10^5) 个 int(s),然后在执行 ## 之后我将它们输出到 stdout。我已经通过使用“setvbuf”和使用“fgets_unlocked()”读取行来处理 INPUT 部分,然后解析它们以获得所需的 int(s)。我有 2 个无法解决的问题:

1.) 因为我在 stdout 上打印 int(s) 500 万,它花费了很多时间:有什么方法可以减少这个(我尝试使用 fwrite() 但 o/p 打印不可打印的字符由于原因using fread to read into int buffer )

2.) 在解析 int(s) 的输入后说 'x' 我实际上通过在循环中对 no 执行 %(mod) 来找到除数的数量。(参见下面的代码):也许这个也是我的代码超时的原因:对此有任何改进的建议。非常感谢这其实是来自http://www.codechef.com/problems/PD13的问题

# include <stdio.h>
# define SIZE 32*1024
char buf[SIZE];

main(void)
{
int i=0,chk =0;
unsigned int j =0 ,div =0;
int a =0,num =0;
char ch;

setvbuf(stdin,(char*)NULL,_IOFBF,0);

scanf("%d",&chk);
while(getchar_unlocked() != '\n');
while((a = fread_unlocked(buf,1,SIZE,stdin)) >0)
{
for(i=0;i<a;i++)
{
if(buf[i] != '\n')
{
num = (buf[i] - '0')+(10*num);
}
else
if(buf[i] == '\n')
{
div = 1;
for(j=2;j<=(num/2);j++)
{
if((num%j) == 0) // Prob 2
{
div +=j;
}
}
num = 0;
printf("%d\n",div); // problem 1
}
}
}
return 0;
}

最佳答案

您的打印速度比 printf 快得多。

查看 itoa(),或编写您自己的简单函数来非常快速地将整数转换为 ascii。

这里是 itoa 的快速 n-dirty 版本,应该可以快速满足您的目的:

char* custom_itoa(int i)
{
static char output[24]; // 64-bit MAX_INT is 20 digits
char* p = &output[23];

for(*p--=0;i/=10;*p--=i%10+0x30);
return ++p;
}

请注意,此函数有一些严重的内置限制,包括:

  • 它不处理负数
  • 它目前不处理十进制形式的大于 23 个字符的数字。
  • 它本质上是线程危险的。不要在多线程环境中尝试。
  • 一旦再次调用该函数,返回值将被破坏。

我写这个纯粹是为了速度,而不是为了安全或方便。

关于c - 优化 C 代码中的 I/O(输出)+ 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9945431/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com