【发布时间】:2012-03-30 14:57:12
【问题描述】:
我有一个代码从标准输入读取大约 (10^5) 个整数,然后在执行 ## 之后将它们输出到标准输出。我已经通过使用“setvbuf”和使用“fgets_unlocked()”读取行来处理 INPUT 部分,然后解析它们以获得所需的 int(s)。 我有 2 个问题无法解决:
1.) 当我在标准输出上打印 int(s) 500 万时,它花费了很多时间:有没有办法减少这个(我尝试使用 fwrite() 但由于原因,o/p 打印了不可打印的字符using fread to read into int buffer)
2.) 在解析 int(s) say 'x' 的输入后,我实际上通过在循环中对 no 执行 %(mod) 来找到除数的 no。(参见下面的代码):也许这个也是我的代码超时的一个原因: 对此有任何改进建议。 非常感谢 这其实是来自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;
}
【问题讨论】:
-
我几乎不相信 stdio 有限制。一般。像这样的程序是严格(磁盘)I/O 绑定的,CPU 利用率将
-
顺便说一句:您的内部循环似乎消耗了所有 CPU。您是否考虑过将数字分解为素数,并生成所有素因数组合的总和?
-
:D @wildplasser 我的答案在下面坐了几分钟......
-
伟大的思想是相似的,所以看起来 ;-} 重新组合主要因素也可能代价高昂。但可能不像尝试所有可能的除数那样昂贵。顺便说一句:恕我直言,这个问题似乎是错误的;对于某些示例,数据 1 被视为除数;但 input=2 的总和被列为 2,而不是 3。
标签: c optimization io