晚上在家没事,突然想起来之前一次面试时的题目,判断一个数是否为质数,当时就一直在想有没有啥简单方法,然而面试官其实只是想让我用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
输出的数字会自动转为科学计数法
个人建议,这代码,玩的时候,测试的数字不要太大,过大的数字要算很久很久很久