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 相关文章推荐
用Socket发送电子邮件
Oct 09 PHP
一个显示天气预报的程序
Oct 09 PHP
php实现网站插件机制的方法
Nov 10 PHP
删除html标签得到纯文本可处理嵌套的标签
Apr 28 PHP
PHP中使用sleep函数实现定时任务实例分享
Aug 21 PHP
php+mysql数据库实现无限分类的方法
Dec 12 PHP
php实现通用的从数据库表读取数据到数组的函数实例
Mar 21 PHP
php中smarty变量修饰用法实例分析
Jun 11 PHP
php 使用curl模拟登录人人(校内)网的简单实例
Jun 06 PHP
php 读写json文件及修改json的方法
Mar 07 PHP
实例讲解通过​PHP创建数据库
Jan 20 PHP
php实现自动生成验证码的实例讲解
Nov 17 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常用ODBC函数集(详细)
2013/06/24 PHP
使用php伪造referer的方法 利用referer防止图片盗链
2014/01/20 PHP
Yii2单元测试用法示例
2016/11/12 PHP
PHP+swoole+linux实现系统监控和性能优化操作示例
2019/04/15 PHP
为Yahoo! UI Extensions Grid增加内置的可编辑器
2007/03/10 Javascript
关于IE、Firefox、Opera页面呈现异同 写脚本很痛苦
2009/08/28 Javascript
Jquery AutoComplete自动完成 的使用方法实例
2010/03/19 Javascript
使图片旋转的3种解决方案
2013/11/21 Javascript
用js代码和插件实现wordpress雪花飘落效果的四种方法
2014/12/15 Javascript
自己编写的支持Ajax验证的JS表单验证插件
2015/05/15 Javascript
js window对象属性和方法相关资料整理
2015/11/11 Javascript
学习JavaScript设计模式之中介者模式
2016/01/14 Javascript
js获取隐藏元素宽高的实现方法
2016/05/19 Javascript
vue.js+Element实现表格里的增删改查
2017/01/18 Javascript
JavaScript基本语法_动力节点Java学院整理
2017/06/26 Javascript
Vue+webpack项目配置便于维护的目录结构教程详解
2018/10/14 Javascript
JS中注入eval, Function等系统函数截获动态代码
2019/04/03 Javascript
JS获取动态添加元素的方法详解
2019/07/31 Javascript
js实现橱窗展示效果
2020/01/11 Javascript
vue单元格多列合并的实现
2020/11/26 Vue.js
基于JavaScript实现简单的轮播图
2021/03/03 Javascript
python抓取百度首页的方法
2015/05/19 Python
Python内置的HTTP协议服务器SimpleHTTPServer使用指南
2016/03/30 Python
Python标准库之collections包的使用教程
2017/04/27 Python
浅谈Python在pycharm中的调试(debug)
2018/11/29 Python
python opencv根据颜色进行目标检测的方法示例
2020/01/15 Python
Python openpyxl 插入折线图实例
2020/04/17 Python
CSS3弹性盒模型开发笔记(二)
2016/04/26 HTML / CSS
HTML5实现一个能够移动的小坦克示例代码
2013/09/02 HTML / CSS
通过HTML5规范搞定i、em、b、strong元素的区别
2017/03/04 HTML / CSS
英国领先品牌手动工具和电动工具供应商:Tooled Up
2018/11/24 全球购物
Wedgwood英国官方网站:英式精致骨瓷餐具、礼品与生活精品,源于1759年
2019/09/02 全球购物
js正则匹配markdown里的图片标签的实现
2021/03/24 Javascript
经理秘书求职自荐信范文
2014/03/23 职场文书
小学开学典礼新闻稿
2015/07/17 职场文书
公司车辆维修管理制度
2015/08/05 职场文书