我有一项任务。我必须计算一个数字的所有整数除数,并将它们写入标准输出。我的程序有效,但在某些情况下会变慢。你知道如何进行优化吗?这是代码:
#include <cstdio>
int main()
{
long n;
scanf("%ld", &n);
printf("1\n");
for(long i = 2; i <= int(n/2); i++)
{
if (n % i == 0)
printf("%ld\n", i);
}
printf("%ld", n);
}
答案 0 :(得分:3)
自然数的除数成对出现:对中的一半是i <= sqrt(n)
,另一半是(n / i) >= sqrt(n)
。接下来,您可以循环到n
而不是n/2
的平方根,然后报告i
和n/i
。
[旁白:您使用long
代表n
,但随后您将n/2
投放到int
。在sizeof(long) > sizeof(int)
的平台上,您将失去精确度。]