php计算两个整数的最大公约数常用算法小结
本文实例讲述了php计算两个整数的最大公约数常用算法。分享给大家供大家参考。具体如下:
<?php
//计时,返回秒
function microtime_float()
{
list($usec, $sec)= explode("", microtime());
return((float)$usec +(float)$sec);
}
//////////////////////////////////////////
//欧几里得算法
functionojld($m,$n){
if($m==0&&$n==0){
returnfalse;
}
if($n==0){
return$m;
}
while($n!=0){
$r=$m%$n;
$m=$n;
$n=$r;
}
return$m;
}
//////////////////////////////////////////
//基于最大公约数的定义
functionbaseDefine($m,$n){
if($m==0&&$n==0){
returnfalse;
}
$min=min($m,$n);
while($min>=1){
if($m%$min==0){
if($n%$min==0){
return$min;
}
}
$min-=1;
}
return$min;
}
////////////////////////////////////////////
//中学数学里面的计算方法
functionbaseSchool($m,$n){
$mp=getList($m);//小于$m的全部质数
$np=getList($n);//小于$n的全部质数
$mz=array(); //保存$m的质因数
$nz=array(); //保存$n的质因数
$mt=$m;
$nt=$n;
//m所有质因数
//遍历m的全部质数,当能够被m整除时,继续下一次整除,知道不能被整除再取下一个能够被m整除
//的质数,一直到所有出现的质数的乘积等于m时停止
foreach($mpas$v){
while($mt%$v==0){
$mz[]=$v;
$mt=$mt/$v;
}
$c=1;
foreach($mzas$v){
$c*=$v;
if($c==$m){
break2;
}
}
}
//n所有质因数
foreach($npas$v){
while($nt%$v==0){
$nz[]=$v;
$nt=$nt/$v;
}
$c=1;
foreach($nzas$v){
$c*=$v;
if($c==$n){
break2;
}
}
}
//公因数
$jj=array_intersect($mz,$nz);//取交集
$gys=array();
//取出在俩数中出现次数最少的因数,去除多余的。
$c=1;//记录数字出现的次数
$p=0;//记录上一次出现的数字
sort($jj);
foreach($jjas$key=>$v){
if($v==$p){
$c++;
}
elseif($p!=0){
$c=1;
}
$p=$v;
$mk=array_keys($mz,$v);
$nk=array_keys($nz,$v);
$k=(count($mk)>count($nk))?count($nk):count($mk);
if($c>$k){
unset($jj[$key]);
}
}
$count=1;
foreach($jjas$value){
$count*=$value;
}
return$count;
}
//求给定大于等于2的整数的连续质数序列
//埃拉托色尼筛选法
functiongetList($num){
$a=array();
$a=array();
for($i=2;$i<=$num;$i++){
$a[$i]=$i;
}
for($i=2;$i<=floor(sqrt($num));$i++){
if($a[$i]!=0){
$j=$i*$i;
while($j<=$num){
$a[$j]=0;
$j=$j+$i;
}
}
}
$p=0;
for($i=2;$i<=$num;$i++){
if($a[$i]!=0){
$L[$p]=$a[$i];
$p++;
}
}
return$L;
}
/////////////////////////////////////
//test
$time_start = microtime_float();
//echoojld(60,24); //0.0000450611seconds
//echobaseDefine(60,24);//0.0000557899seconds
echobaseSchool(60,24); //0.0003471375seconds
$time_end = microtime_float();
$time = $time_end - $time_start;
echo'<br>'.sprintf('%1.10f',$time).'seconds';
希望本文所述对大家的php程序设计有所帮助。