晚上在家没事,突然想起来之前一次面试时的题目,判断一个数是否为质数,当时就一直在想有没有啥简单方法,然而面试官其实只是想让我用for循环来判断而已.
有时候就是会自作聪明想找捷径却不得其法.
今天就在代码里实现以下吧.

<?php
//以命令行的模式来启动脚本,所以用$_SERVER['argv']来获取输入参数
$argv = $_SERVER['argv'];
$number = $argv[1];
//比如保存代码为test.php 则脚本调用方式为 php test.php 13
//上一行注释中的13就是待计算是否为质数的数字
var_dump($number);
echoBr();
function echoBr()
{
    echo "\r\n";
}

checkIsPrime($number);

function checkIsPrime($number)
{
    //因为是命令行模式输入的参数,我们前面获取的number肯定为字符串类型
    //所以可以用ctype_digit函数乱来判断是否为正整数
    if(!ctype_digit($number))
    {
        echo 'must input nember bigger than 0 and is int';
        return false;
    }
    //质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数
    if($number<=2)
    {
        echo "It isn't Prime";
        echoBr();
        echo 'It is 2';
        return false;
    }
    
    //从2开始,循环递增小于$number的除数$i求余数
    for ($i=2;$i<$number;$i++)
    {
        $remainder = bcmod($number,$i);
        使用bc函数取余数(取模)
        if($remainder == 0)
        //余数等于0的话说明可以整除,存在因数i,此时就可以提前结束循环返回结果了
        {
            echo "It isn't Prime";
            echoBr();
            echo $i;
            echoBr();
            echo $number/$i;
            return false;
        }
    }
    //直到循环结束未找到1和本身之外的因数,所以,可以判断该数为质数
    echo "It is Prime";
    return false;
}

尝试如下结果

$ php test.php 3546546
string(7) "3546546"

It isn't Prime
2
1773273
$ php test.php 4999999
string(7) "4999999"

It is Prime

但是当输入数字比较大时,会出现意想不到的结果.

$ php test.php 234234234234599999999999999999999999999999999999999999999999999999999354564546465456
string(84) "234234234234599999999999999999999999999999999999999999999999999999999354564546465456"

It isn't Prime
2
1.171171171173E+83

输出的数字会自动转为科学计数法

个人建议,这代码,玩的时候,测试的数字不要太大,过大的数字要算很久很久很久

最后修改:2021 年 03 月 25 日
如果想投币,那就打发点儿咯.