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个人网站架设连环讲(三)
Oct 09 PHP
php中判断一个字符串包含另一个字符串的方法
Mar 19 PHP
PHP小程序自动提交到自助友情连接
Nov 24 PHP
PHP 检查扩展库或函数是否可用的代码
Apr 06 PHP
PHP校验ISBN码的函数代码
Jan 17 PHP
php接口与接口引用的深入解析
Aug 09 PHP
根据ip调用新浪api获取城市名并转成拼音
Mar 07 PHP
WordPress中用于获取文章作者与分类信息的方法整理
Dec 17 PHP
WordPress中转义HTML与过滤链接的相关PHP函数使用解析
Dec 22 PHP
php远程下载类分享
Apr 13 PHP
关于php中的json_encode()和json_decode()函数的一些说明
Nov 20 PHP
PHP getName()函数讲解
Feb 03 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:风雨欲来 路在何方?
2006/10/09 PHP
让你的网站首页自动选择语言转跳
2006/12/06 PHP
劣质的PHP代码简化
2010/02/08 PHP
PHP Memcached + APC + 文件缓存封装实现代码
2010/03/11 PHP
PHP开发框架kohana3 自定义路由设置示例
2014/07/14 PHP
php中time()与$_SERVER[REQUEST_TIME]用法区别
2014/11/19 PHP
php实现的redis缓存类定义与使用方法示例
2017/08/09 PHP
PHP下载大文件失败并限制下载速度的实例代码
2019/05/10 PHP
js和php如何获取当前url的内容
2013/09/22 Javascript
js生成的验证码的实现与技术分析
2014/09/17 Javascript
jQuery实现form表单基于ajax无刷新提交方法详解
2015/12/08 Javascript
JavaScript组件开发完整示例
2015/12/15 Javascript
js enter键激发事件实例代码
2016/08/17 Javascript
javascript简单实现跟随滚动条漂浮的返回顶部按钮效果
2016/08/19 Javascript
详谈表单重复提交的三种情况及解决方法
2017/08/16 Javascript
浅谈angular2路由预加载策略
2017/10/04 Javascript
解决webpack无法通过IP地址访问localhost的问题
2018/02/22 Javascript
Vue+Koa2+mongoose写一个像素绘板的实现方法
2019/09/10 Javascript
微信小程序实现图片压缩
2019/12/03 Javascript
在vue中实现禁止屏幕滚动,禁止屏幕滑动
2020/07/22 Javascript
vue中解决微信html5原生ios虚拟键返回不刷新问题
2020/10/20 Javascript
使用 Python 获取 Linux 系统信息的代码
2014/07/13 Python
解决Pycharm调用Turtle时 窗口一闪而过的问题
2019/02/16 Python
matplotlib实现区域颜色填充
2019/03/18 Python
Python3.5文件修改操作实例分析
2019/05/01 Python
Python socket模块ftp传输文件过程解析
2019/11/05 Python
python如何调用java类
2020/07/05 Python
python和go语言的区别是什么
2020/07/20 Python
PyCharm2020最新激活码+激活码补丁(亲测最新版PyCharm2020.2激活成功)
2020/11/25 Python
Kate Spade美国官网:纽约新兴时尚品牌,以包包闻名于世
2017/11/09 全球购物
程序员经常用到的UNIX命令
2015/04/13 面试题
婚纱摄影师求职信
2014/03/07 职场文书
行风评议整改报告
2014/11/06 职场文书
中职班主任培训心得体会
2016/01/07 职场文书
vue backtop组件的实现完整代码
2021/04/07 Vue.js
PyCharm 配置SSH和SFTP连接远程服务器
2022/05/11 Python