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音乐采集(部分代码)
Feb 14 PHP
php excel类 phpExcel使用方法介绍
Aug 21 PHP
php基础学习之变量的使用
Jun 09 PHP
PHP获取网址的顶级域名函数代码
Sep 24 PHP
深入PHP magic quotes的详解
Jun 17 PHP
在Windows XP下安装Apache+MySQL+PHP环境
Feb 22 PHP
PHP通过API获取手机号码归属地
May 28 PHP
Yii清理缓存的方法
Jan 06 PHP
PHP编程基本语法快速入门手册
Jan 07 PHP
yii2使用ajax返回json的实现方法
May 14 PHP
Laravel 实现在Blade模版中使用全局变量代替路径的例子
Oct 22 PHP
Nginx+php配置文件及原理解析
Dec 09 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
php5新改动之短标记启用方法
2008/09/11 PHP
php_screw安装使用教程(另一个PHP代码加密实现)
2014/05/29 PHP
php常用字符串查找函数strstr()与strpos()实例分析
2019/06/21 PHP
javascript hasFocus使用实例
2010/06/29 Javascript
jqeury eval将字符串转换json的方法
2011/01/20 Javascript
深入理解JQuery keyUp和keyDown的区别
2013/12/12 Javascript
jquery 自定义容器下雨效果可将下雨图标改为其他
2014/04/23 Javascript
nodejs中转换URL字符串与查询字符串详解
2014/11/26 NodeJs
JS修改iframe页面背景颜色的方法
2015/04/01 Javascript
浅谈setTimeout 与 setInterval
2015/06/23 Javascript
jquery图片轮播特效代码分享
2020/04/20 Javascript
基于Jquery插件实现跨域异步上传文件功能
2016/04/26 Javascript
AngularJS实现树形结构(ztree)菜单示例代码
2016/09/18 Javascript
使用JavaScript触发过渡效果的方法
2017/01/19 Javascript
mpvue 如何使用腾讯视频插件的方法
2018/07/16 Javascript
使用jquery实现轮播图效果
2021/01/02 jQuery
web.py在SAE中的Session问题解决方法(使用mysql存储)
2015/06/24 Python
Python的Django框架中的表单处理示例
2015/07/17 Python
python中解析json格式文件的方法示例
2017/05/03 Python
Django安装配置mysql的方法步骤
2018/10/15 Python
python机器学习库scikit-learn:SVR的基本应用
2019/06/26 Python
Python 实现Numpy中找出array中最大值所对应的行和列
2019/11/26 Python
flask框架配置mysql数据库操作详解
2019/11/29 Python
Python自动化办公Excel模块openpyxl原理及用法解析
2020/11/05 Python
Pyecharts 中Geo函数常用参数的用法说明
2021/02/01 Python
详解使用双缓存解决Canvas clearRect引起的闪屏问题
2019/04/29 HTML / CSS
Holiday Inn中国官网:IHG旗下假日酒店预订
2018/04/08 全球购物
意大利香水和化妆品购物网站:Parfimo.it
2019/10/06 全球购物
美国专业消费电子及摄影器材网站:B&H Photo Video
2019/12/18 全球购物
机械制造与自动化应届生求职信
2013/11/16 职场文书
医药代表个人求职信范本
2013/12/19 职场文书
餐厅经理岗位职责和岗位目标
2014/02/13 职场文书
信用卡工作证明模板
2014/09/14 职场文书
检讨书怎么写
2015/01/23 职场文书
团员个人年度总结
2015/02/26 职场文书
vue+elementUI实现表格列的显示与隐藏
2022/04/13 Vue.js