PHP中的SPOJ素发生器

时间:2016-02-12 11:23:35

标签: php

我提交解决方案时收到time limit exceeded错误。

<?php
$stdin = fopen('php://stdin', 'r');
$testcase = fgets($stdin);
$n=1;
while($n<=$testcase){   
    $start = fgets($stdin);
    $end=fgets($stdin);
    if($start==1) {
        $start=2;
    }
    for($i=$start;$i<$end;$i++){
        $flag=0;
        for($j=2;$j<$i;$j++){
            if($i%$j==0){
                $flag=1;
                break;
            }
        }
        if($flag==0){
            echo $i."\n";
        }
    }
    $n++;
}

fclose($stdin);
?>

请帮助我,我遇到time limit exceeded错误,请解释我收到此错误的原因。在我的本地版本中,它显示了正确的答案。

2 个答案:

答案 0 :(得分:1)

你的解决方案太慢了。尝试略微修改的Eratosthenes筛。修改应该允许您的筛选仅在[开始结束]间隔内工作。

答案 1 :(得分:0)

在第一个for循环中,而不是循环所有数字,你可以只循环奇数,因为除了2之外,所有偶数都不能是素数。

您可以先在{for循环中使用$i+=2。这可以帮助您减少一些不必要的循环。

更新1:

同样在第二个for循环中,不是找到所有数字的模数,而是可以将计算出的素数存储在数组中并检查$i % calculated prime numbers == 0而不是$i%$j

相关问题