for (int i = 2; i * i <= n; i++)
for (int i = 2; i <= SQRT(n); i++)
只是想知道哪个更快我看了一些原始算法来获得根源,在我看来,平方数字会更快,但我不确定。这些循环用于确定数字“素数”。
答案 0 :(得分:1)
编译器可能'缓存'SQRT(n)的结果,但我应该计算每一步。
答案 1 :(得分:1)
平方根需要更长时间,除非它是在硬件,查找或特殊机器代码版本中实现的。牛顿迭代是首选算法;它以二次方式收敛。
最适合自己的基准测试。我建议将调用移到循环外的平方根,这样你只需要执行一次而不是每次检查退出条件。
答案 2 :(得分:1)
不应该介于
之间int sqrt = SQRT(n);
for (int i = 2; i <= sqrt; i++)
和
for (int i = 2; i * i <= n; i++)
答案取决于你做了多少循环迭代。 sqrt方法每次迭代的工作量较少,但启动成本较高。请注意,这是对过早优化的不满。
答案 3 :(得分:1)
为什么不跳过这两个并使用一些聪明的数学?以下代码使用属性避免它们两个,即第一个n
奇数的和总是一个完美的平方。
我旧blogpost的无耻插件(来自我死去的博客)
int isPrime(int n)
{
int squares = 1;
int odd = 3;
if( ((n & 1) == 0) || (n < 9)) return (n == 2) || ((n > 1) && (n & 1));
else
{
for( ;squares <= n; odd += 2)
{
if( n % odd == 0)
return 0;
squares+=odd;
}
return 1;
}
}
答案 4 :(得分:0)
广场会更快。
但是如果n大于最大int的平方根,则方块将溢出,然后比较将出错。平方根函数可以(并且你期望)以这样的方式实现,即可以在参数上计算直到最大的可表示的int。这意味着它不会以这种方式出错。
在Java中,最大的int是2 ^ 31 - 1,这意味着它的平方根刚好低于46341.如果你想寻找大于那个的素数,那么平方就会阻止你。