美文网首页PHP经验分享
PHP算法之求1000万之内素数的个数(10秒以内)

PHP算法之求1000万之内素数的个数(10秒以内)

作者: 小牛_6666 | 来源:发表于2019-05-30 00:14 被阅读44次

最近刷牛客网编程题的时候,遇到一个题
输入一个整数n(1≤n≤10000000),输出n以内素数的个数。时间限制:1秒 空间限制:32768K

这个题需求很简单,难就难在时间限制1秒,内存限制32M

网络上求素数个数的方法有很多,大部分都是非PHP语言写的,转成PHP语言之后就会有点问题,要么是速度太慢,要么就是内存溢出,毕竟在一些运算上面PHP是没办法和C语言相比的。琢磨了很长时间也没办法实现1秒之内求出1000万之内素数的个数,最好的在10秒以内,差了一个数量级。


1540006579798.jpg

推算

10以内的素数 :

排除掉[2,3,5] 的整倍数[2,3,4,5,6,8,9,10],结果=10-count([4,6,8,9,10])+count([2,3,5])-1=4

30以内的素数:

排除掉 [2,3,5,7] 的整倍数[2,3,5,6,7,8,9,10,12,14...],结果=30-count([2,3,5,6,7,8,9,10,12,14...])+count([2,3,5,7])-1=10

总结一下

求n以内素数的个数
1,求出一个数组$prime_arr,这个数组是一个素数的集合,从2开始循环生成素数,当生成的素数大于n的开方的时候,停止,这时得到这个数组$prime_arr;
2,循环n,如果值v能被数组$prime_arr中任何一个数整除,则把v这个数排除掉
3,统计没有被排除的数的个数,再加上$prime_arr的个数,再减去1,就是结果了
代码如下

<?php
fscanf(STDIN,'%d',$a);
$t1=microtime(true);
$arr=prime_arr($a);
$n=$a-1;//素数个数,排除法
for ($i=2;$i<=$a;$i++){
    foreach ($arr as $v){
        if($i % $v ==0){
            $n--;
            break;
        }
    }
}
$t2=microtime(true);
echo $n+count($arr)."\t".round($t2-$t1,3)."\n";

/**
 * 下一个素数
 */
function next_prime($i){//下一个质数
    while (true){
        $i++;
        if($i==2){
            return $i;
        }elseif ($i<2){
            continue;
        }
        $is=true;
        for($j=2;$j<=sqrt($i);$j++){
            if($i % $j ==0){
                $is=false;
            }
        }
        if($is){
            return $i;
        }
    }
}

/**
 * 作为除数的素数数组
 */
function prime_arr($a){
    if($a<=1){
        return [];
    }
    $arr=[];
    $prime=0;
    while ($prime<=sqrt($a)){
        $prime=next_prime($prime);
        $arr[]=$prime;
    }
    return $arr;
}

运行代码,输入1000000 ,返回664579 9.522
一共664579个素数,耗时9.5秒,没办法通过测试


1538925008095.jpg

相关文章

  • PHP算法之求1000万之内素数的个数(10秒以内)

    最近刷牛客网编程题的时候,遇到一个题输入一个整数n(1≤n≤10000000),输出n以内素数的个数。时间限制:1...

  • python作业一:素数问题

    求100以内的素数。 解题思路:素数,只能被1和他本身整除的数。那么,我们就用100以内的每个数(1除外)去除以比...

  • 暑期打卡第1天(素数问题)

    题目:求100之内的素数(逆向思维) 程序分析:建立一个数组,判断是素数则清空值,否则不清空。 程序: #incl...

  • java 编程

    找出三个数中的最大数和最小数 求1 + 2 + ... + 100的值 求100以内的素数 计算输出1!,2!.....

  • 【习题27】

    程序27】题目:求100之内的素数

  • 筛法求N以内的素数Java实现

    使用筛法求N以内的素数,从2开始,不断剔除2的倍数,然后从剩下的数字中,选择最小的数3(这个数一定会是素数),然后...

  • 204. Count Primes

    n以内素数的个数。 参考:埃拉托斯特尼筛法和素数判断 代码:

  • 2019-03-24

    今天写下来,关于筛子算法,计算素数,针对大数的判断。简单写一下算法,假设计算40000以内的素数。 筛子算法, 百...

  • python 求100以内的素数

    题目一 :求100以内的素数(素数为只能被1和它本身整除的整数) 解题思路: 求出100以内除了1的所有整数(1不...

  • 求素数个数

    我最近在leetcode上撸了一个小算法,虽然已经工作了五年,当看到每次代码提交后排名的提升,内心依然很有成就感。...

网友评论

    本文标题:PHP算法之求1000万之内素数的个数(10秒以内)

    本文链接:https://www.haomeiwen.com/subject/ttdytctx.html