php计算两个整数的最大公约数常用算法小结


Posted in PHP onMarch 05, 2015

本文实例讲述了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 '<br>' . sprintf('%1.10f', $time) . 'seconds';

希望本文所述对大家的php程序设计有所帮助。

PHP 相关文章推荐
快速开发一个PHP扩展图文教程
Dec 12 PHP
PHP 防恶意刷新实现代码
May 16 PHP
PHP合并数组+与array_merge的区别分析
Aug 01 PHP
PHP中extract()函数的妙用分析
Jul 11 PHP
PHP之生成GIF动画的实现方法
Jun 07 PHP
PHP和MySql中32位和64位的整形范围是多少
Feb 18 PHP
深入解析PHP的Laravel框架中的event事件操作
Mar 21 PHP
PHP生成加减算法方式的验证码实例
Mar 12 PHP
php实现微信原生支付(扫码支付)功能
May 30 PHP
PHP addslashes()函数讲解
Feb 03 PHP
laravel框架select2多选插件初始化默认选中项操作示例
Feb 18 PHP
Memcached介绍及php-memcache扩展安装
Apr 01 PHP
PHP 使用memcached简单示例分享
Mar 05 #PHP
Ubuntu中搭建Nginx、PHP环境最简单的方法
Mar 05 #PHP
PHP实现支持SSL连接的SMTP邮件发送类
Mar 05 #PHP
PHP 使用redis简单示例分享
Mar 05 #PHP
memcache一致性hash的php实现方法
Mar 05 #PHP
PHP将session信息存储到数据库的类实例
Mar 04 #PHP
php微信支付之APP支付方法
Mar 04 #PHP
You might like
PHP 冒泡排序 二分查找 顺序查找 二维数组排序算法函数的详解
2013/06/25 PHP
浅析PHP绘图技术
2013/07/03 PHP
php number_format() 函数通过千位分组来格式化数字的实现代码
2013/08/06 PHP
php实现点击可刷新验证码
2015/11/07 PHP
php微信开发之图片回复功能
2018/06/14 PHP
asp.net和php的区别点总结
2019/10/10 PHP
js操作iframe兼容各种主流浏览器示例代码
2013/07/22 Javascript
jquery动态更换设置背景图的方法
2014/03/25 Javascript
js与jquery回车提交的方法
2015/02/03 Javascript
使用JavaScript 实现的人脸检测
2015/03/24 Javascript
js获取当前日期时间及其它操作汇总
2015/04/17 Javascript
Nodejs爬虫进阶教程之异步并发控制
2016/02/15 NodeJs
创建基于Bootstrap的下拉菜单的DropDownList的JQuery插件
2016/06/02 Javascript
Jquery实现上下移动和排序代码
2016/10/17 Javascript
js获取当前时间(昨天、今天、明天)
2016/11/23 Javascript
javaScript基础详解
2017/01/19 Javascript
详解webpack介绍&amp;安装&amp;常用命令
2017/06/29 Javascript
security.js实现的RSA加密功能示例
2018/06/06 Javascript
js如何实现元素曝光上报
2019/08/07 Javascript
使用Node.js实现base64和png文件相互转换的方法
2020/03/11 Javascript
[01:09:23]KG vs TNC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
[01:23:45]DOTA2-DPC中国联赛 正赛 CDEC vs Dragon BO3 第一场 1月22日
2021/03/11 DOTA
python结合API实现即时天气信息
2016/01/19 Python
python中实现指定时间调用函数示例代码
2017/09/08 Python
Python遍历某目录下的所有文件夹与文件路径
2018/03/15 Python
django2+uwsgi+nginx上线部署到服务器Ubuntu16.04
2018/06/26 Python
Sanic框架配置操作分析
2018/07/17 Python
python得到单词模式的示例
2018/10/15 Python
对python mayavi三维绘图的实现详解
2019/01/08 Python
对Python获取屏幕截图的4种方法详解
2019/08/27 Python
pytorch中tensor张量数据类型的转化方式
2019/12/31 Python
Python实现http接口自动化测试的示例代码
2020/10/09 Python
简单聊聊H5的pushState与replaceState的用法
2018/04/03 HTML / CSS
市场部专员岗位职责
2013/11/30 职场文书
部队党性分析材料
2014/02/16 职场文书
2015年乡镇扶贫工作总结
2015/04/08 职场文书