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 相关文章推荐
杏林同学录(五)
Oct 09 PHP
与数据库连接
Oct 09 PHP
配置支持SSI
Nov 25 PHP
PHP获取表单textarea数据中的换行问题
Sep 10 PHP
允许phpmyadmin空密码登录的配置方法
May 29 PHP
PHP 图片上传代码
Sep 13 PHP
PHP中几种常见的超时处理全面总结
Sep 11 PHP
PHP中的访问修饰符简单比较
Feb 02 PHP
详解PHP队列的实现
Mar 14 PHP
PHP小程序支付功能完整版【基于thinkPHP】
Mar 26 PHP
Laravel框架查询构造器 CURD操作示例
Sep 04 PHP
laravel 解决ajax异步提交数据,并还回填充表格的问题
Oct 15 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
用session做客户验证时的注意事项
2006/10/09 PHP
php中sql注入漏洞示例 sql注入漏洞修复
2014/01/24 PHP
PHP将MySQL的查询结果转换为数组并用where拼接的示例
2016/05/13 PHP
使用 PHP Masked Package 屏蔽敏感数据的实现方法
2019/10/15 PHP
Jquery操作Select 简单方便 一个js插件搞定
2009/11/12 Javascript
Jquery乱码的一次解决过程 图解教程
2010/02/20 Javascript
Jquery中显示隐藏的实现代码分析
2011/07/26 Javascript
jQuery平滑旋转幻灯片特效代码分享
2015/09/07 Javascript
js addDqmForPP给标签内属性值加上双引号的函数
2016/12/24 Javascript
原生js实现手风琴功能(支持横纵向调用)
2017/01/13 Javascript
iscroll实现下拉刷新功能
2017/07/18 Javascript
JS自定义函数实现时间戳转换成date的方法示例
2017/08/27 Javascript
基于axios 解决跨域cookie丢失的问题
2018/09/26 Javascript
Vue组件通信的几种实现方法
2019/04/25 Javascript
Vue安装浏览器开发工具的步骤详解
2019/05/12 Javascript
基于JavaScript获取url参数2种方法
2020/04/17 Javascript
ES6扩展运算符和rest运算符用法实例分析
2020/05/23 Javascript
pygame播放音乐的方法
2015/05/19 Python
Linux系统上Nginx+Python的web.py与Django框架环境
2015/12/25 Python
Django objects的查询结果转化为json的三种方式的方法
2018/11/07 Python
python ipset管理 增删白名单的方法
2019/01/14 Python
python flask框架实现传数据到js的方法分析
2019/06/11 Python
Appium+python自动化怎么查看程序所占端口号和IP
2019/06/14 Python
python aiohttp的使用详解
2019/06/20 Python
pytorch中的embedding词向量的使用方法
2019/08/18 Python
python elasticsearch环境搭建详解
2019/09/02 Python
Python生成验证码、计算具体日期是一年中的第几天实例代码详解
2019/10/16 Python
Python map及filter函数使用方法解析
2020/08/06 Python
python 30行代码实现蚂蚁森林自动偷能量
2021/02/08 Python
高一学生期末评语
2014/04/25 职场文书
2014市府办领导班子“四风问题”对照检查材料思想汇报
2014/09/24 职场文书
小学语文教师年度考核个人总结
2015/02/05 职场文书
装饰技术负责人岗位职责
2015/04/13 职场文书
医疗纠纷调解协议书
2015/08/06 职场文书
Pytest中skip和skipif的具体使用方法
2021/06/30 Python
docker 制作mysql镜像并自动安装
2022/05/20 Servers