最大公约数PHP算法,php取两个整数的最大公约数算法大全

php计算两个整数的最大公约数常用算法,代码如下:<?php

//计时,返回秒

function microtime_float ()

{

list( $usec , $sec ) = explode ( " " , microtime ());

return ((float) $usec + (float) $sec );

}

//

//欧几里得算法

function ojld($m, $n) {

if($m ==0 && $n == 0) {

return false;

}

if($n == 0) {

return $m;

}

while($n != 0){

$r = $m % $n;

$m = $n;

$n = $r;

}

return $m;

}

//

//基于最大公约数的定义

function baseDefine($m, $n) {

if($m ==0 && $n == 0) {

return false;

}

$min = min($m, $n);

while($min >= 1) {

if($m % $min == 0){

if($n % $min ==0) {

return $min;

}

}

$min -= 1;

}

return $min;

}

//中学数学里面的计算方法

function baseSchool($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($mp as $v) {

while($mt % $v == 0) {

$mz[] = $v;

$mt = $mt / $v;

}

$c = 1;

foreach($mz as $v) {

$c *= $v;

if($c == $m){

break 2;

}

}

}

//n所有质因数

foreach($np as $v) {

while($nt % $v == 0) {

$nz[] = $v;

$nt = $nt / $v;

}

$c = 1;

foreach($nz as $v) {

$c *= $v;

if($c == $n){

break 2;

}

}

}

//公因数

$jj = array_intersect($mz, $nz); //取交集

$gys = array();

//取出在俩数中出现次数最少的因数,去除多余的。

$c = 1; //记录数字出现的次数

$p = 0; //记录上一次出现的数字

sort($jj);

foreach($jj as $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($jj as $value) {

$count *= $value;

}

return $count;

}

//求给定大于等于2的整数的连续质数序列

//埃拉托色尼筛选法

function getList($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 ();

//echo ojld(60, 24); //0.0000450611 seconds

//echo baseDefine(60, 24); //0.0000557899 seconds

echo baseSchool(60, 24); //0.0003471375 seconds

$time_end = microtime_float ();

$time = $time_end - $time_start ;

echo '
' . sprintf('%1.10f', $time) . 'seconds';

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值