超出执行时间

时间:2014-03-08 10:03:58

标签: php algorithm

我试图找到2000000以下所有素数的总和,这是我的代码:

$set = 0;
for($i = 1; $i < 2000000; $i++){
    if(is_prime($i)){
        $set += $i;
    }
}

echo $set;

is_prime是我创建的自定义函数,用于查找数字是否为素数。问题是它需要花费太多时间来执行。有什么方法可以优化它吗?

2 个答案:

答案 0 :(得分:2)

告诉PHP不要在几秒钟内使用set_time_limit超时(0表示无限)

 set_time_limit(0);

你的循环也没有效率,2以外的素数不能是偶数,所以你应该加强+ 2并将2添加到起始$ set

$set = 2

for($i = 1; $i < 2000000; $i += 2)

代码:

<?php
set_time_limit(0);

$set = 2;  // 2 is a prime number so must be included in the set

for($i = 1; $i < 2000000; $i += 2){
    if(is_prime($i)){
        $set += $i;
    }
}

echo $set;
?>

答案 1 :(得分:0)

我认为is_prime($i) - 方法是瓶颈。

您可以使用Sieve of Eratosthenes计算2000000位中的所有素数(或者如果您只存储奇数:1000000)来计算所有素数(离线)到2000000,这些素数适合RAM并使{ {1}} is_prime($i)时间。