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 chr() ord()中文截取乱码问题解决方法
Sep 08 PHP
php学习之变量的使用
May 29 PHP
解析PHP的session过期设置
Jun 29 PHP
PHP读取文件内容后清空文件示例代码
Mar 18 PHP
phpmailer中文乱码问题的解决方法
Apr 22 PHP
PHP中遇到BOM、编码导致json_decode函数无法解析问题
Jul 02 PHP
在Ubuntu 14.04上部署 PHP 环境及 WordPress
Sep 02 PHP
PHP判断IP并转跳到相应城市分站的方法
Mar 25 PHP
PHP数组和explode函数示例总结
May 08 PHP
Yii实现的多级联动下拉菜单
Jul 13 PHP
thinkPHP实现多字段模糊匹配查询的方法
Dec 01 PHP
YII分模块加载路由的实现方法
Oct 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同时支持GIF、png、JPEG
2006/10/09 PHP
php在window iis的莫名问题的测试方法
2013/05/14 PHP
网页和浏览器兼容性问题汇总(draft1)
2009/06/01 Javascript
jquery dialog键盘事件代码
2010/08/01 Javascript
js随机颜色代码的多种实现方式
2013/04/23 Javascript
js的Prototype属性解释及常用方法
2014/05/08 Javascript
使用jquery.qrcode生成彩色二维码实例
2014/08/08 Javascript
用jquery实现动画跳到顶部和底部(这个比较简单)
2014/09/01 Javascript
使用typeof方法判断undefined类型
2014/09/09 Javascript
javascript实现单击和双击并存的方法
2014/12/13 Javascript
Nodejs学习笔记之测试驱动
2015/04/16 NodeJs
JS实现霓虹灯文字效果的方法
2015/08/06 Javascript
基于JavaScript Array数组方法(新手必看篇)
2016/08/20 Javascript
vue如何集成raphael.js中国地图的方法示例
2017/08/15 Javascript
jQuery实现表单动态加减、ajax表单提交功能
2018/06/08 jQuery
js类的继承定义与用法分析
2019/06/21 Javascript
三分钟教你用Node做一个微信哄女友(基友)神器(面向小白)
2019/06/21 Javascript
[01:32]TI奖金增速竟因它再创新高!DOTA2勇士令状不朽珍藏Ⅰ饰品欣赏
2018/05/18 DOTA
pyqt4教程之messagebox使用示例分享
2014/03/07 Python
Python编码爬坑指南(必看)
2016/06/10 Python
python 数据清洗之数据合并、转换、过滤、排序
2017/02/12 Python
python 中random模块的常用方法总结
2017/07/08 Python
python 获取字符串MD5值方法
2018/05/29 Python
python暴力解压rar加密文件过程详解
2019/07/05 Python
python实现PCA降维的示例详解
2020/02/24 Python
jupyter 导入csv文件方式
2020/04/21 Python
python 监控logcat关键字功能
2020/09/04 Python
Pycharm快捷键配置详细整理
2020/10/13 Python
python 爬虫网页登陆的简单实现
2020/11/30 Python
Shopee新加坡:东南亚与台湾电商平台
2019/01/25 全球购物
linux面试题参考答案(9)
2016/01/29 面试题
雷锋精神演讲稿
2014/05/13 职场文书
初中优秀教师事迹材料
2014/08/18 职场文书
超市开业庆典活动策划方案
2014/09/15 职场文书
党员国庆节演讲稿范文2014
2014/09/21 职场文书
党政领导班子群众路线对照检查材料
2014/10/26 职场文书