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写的采集程序
Mar 16 PHP
PHP获取网卡地址的代码
Apr 09 PHP
PHP中去掉字符串首尾空格的方法
May 19 PHP
php中jpgraph类库的使用介绍
Aug 08 PHP
php5.3 不支持 session_register() 此函数已启用的解决方法
Nov 12 PHP
测试php连接mysql是否成功的代码分享
Jan 24 PHP
php实现获取文件mime类型的方法
Feb 11 PHP
PHP也能干大事 随机函数
Apr 14 PHP
64位windows系统下安装Memcache缓存
Dec 06 PHP
PHP编程求最大公约数与最小公倍数的方法示例
May 29 PHP
PHP实现APP微信支付的实例讲解
Feb 10 PHP
PHP模版引擎原理、定义与用法实例
Mar 29 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
各种咖啡的英文名子是什么
2021/03/03 新手入门
PHP在XP下IIS和Apache2服务器上的安装
2006/09/05 PHP
php阻止页面后退的方法分享
2014/02/17 PHP
CI框架无限级分类+递归的实现代码
2016/11/01 PHP
THinkPHP获取客户端IP与IP地址查询的方法
2016/11/14 PHP
关于Yii2框架跑脚本时内存泄漏问题的分析与解决
2019/12/01 PHP
读jQuery之十四 (触发事件核心方法)
2011/08/23 Javascript
再谈Jquery Ajax方法传递到action(补充)
2014/05/12 Javascript
javascript中的正则表达式使用详解
2015/08/30 Javascript
JavaScript中最容易混淆的作用域、提升、闭包知识详解(推荐)
2016/09/05 Javascript
遍历js中对象的属性和值的实例
2016/11/21 Javascript
基于jQuery实现数字滚动效果
2017/01/16 Javascript
socket.io学习教程之基础介绍(一)
2017/04/29 Javascript
JavaScript数据结构学习之数组、栈与队列
2017/05/02 Javascript
VueJS事件处理器v-on的使用方法
2017/09/27 Javascript
深入剖析Express cookie-parser中间件实现示例
2018/02/01 Javascript
JavaScript canvas实现跟随鼠标事件
2020/02/10 Javascript
vue 使用饿了么UI仿写teambition的筛选功能
2021/03/01 Vue.js
linux 下实现python多版本安装实践
2014/11/18 Python
Python中使用dom模块生成XML文件示例
2015/04/05 Python
python使用minimax算法实现五子棋
2019/07/29 Python
分享8点超级有用的Python编程建议(推荐)
2019/10/13 Python
python 实现一个反向单位矩阵示例
2019/11/29 Python
在ipython notebook中使用argparse方式
2020/04/20 Python
浅谈django框架集成swagger以及自定义参数问题
2020/07/07 Python
详解pyqt5的UI中嵌入matplotlib图形并实时刷新(挖坑和填坑)
2020/08/07 Python
Python面向对象多态实现原理及代码实例
2020/09/16 Python
技术总监岗位职责
2013/12/05 职场文书
顶岗实习计划书
2014/01/10 职场文书
内衣营销方案
2014/03/15 职场文书
中国梦团日活动总结
2014/07/07 职场文书
2015年试用期工作总结
2014/12/12 职场文书
个人年终总结怎么写
2015/03/09 职场文书
幼儿园六一主持词
2015/06/30 职场文书
企业安全生产检查制度
2015/08/06 职场文书
python爬取企查查企业信息之selenium自动模拟登录企查查
2021/04/08 Python