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 相关文章推荐
hadoop中一些常用的命令介绍
Jun 19 PHP
smarty内置函数config_load用法实例
Jan 22 PHP
php可应用于面包屑导航的递归寻找家谱树实现方法
Feb 02 PHP
Linux系统下PHP-FPM的安装和配置教程
Aug 17 PHP
PHP中substr函数字符串截取用法分析
Jan 07 PHP
使用PHP处理数据库数据如何将数据返回客户端并显示当前状态
Feb 16 PHP
php函数mkdir实现递归创建层级目录
Oct 27 PHP
php微信公众平台开发(一) 配置接口
Dec 06 PHP
thinkPHP5框架导出Excel文件简单操作示例
Aug 03 PHP
PHP实现数据四舍五入的方法小结【4种方法】
Mar 27 PHP
Laravel 5.4前后台分离,通过不同的二级域名访问方法
Oct 13 PHP
PDO实现学生管理系统
Mar 21 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
CodeIgniter针对lighttpd服务器URL重写的方法
2015/06/10 PHP
php读取torrent种子文件内容的方法(测试可用)
2016/05/03 PHP
深入理解Yii2.0乐观锁与悲观锁的原理与使用
2017/07/26 PHP
PHP strripos函数用法总结
2019/02/11 PHP
解决php用mysql方式连接数据库出现Deprecated报错问题
2019/12/25 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
2020/02/22 PHP
在视频前插入广告
2006/11/20 Javascript
js window.open弹出新的网页窗口
2014/01/16 Javascript
nodejs开发微博实例
2015/03/25 NodeJs
javascript实现tab响应式切换特效
2016/01/29 Javascript
JavaScript实现九九乘法表的简单实例
2016/06/07 Javascript
JS实现环形进度条(从0到100%)效果
2016/07/05 Javascript
vue.js入门教程之基础语法小结
2016/09/01 Javascript
node.js 中间件express-session使用详解
2017/05/20 Javascript
React利用插件和不用插件实现双向绑定的方法详解
2017/07/03 Javascript
babel之配置文件.babelrc入门详解
2018/02/22 Javascript
vue用Object.defineProperty手写一个简单的双向绑定的示例
2018/07/09 Javascript
JS使用对象的defineProperty进行变量监控操作示例
2019/02/02 Javascript
[47:55]Ti4第二日主赛事败者组 NaVi vs EG 1
2014/07/20 DOTA
[03:00]《DAC最前线》之欧美新秀VS老将
2015/02/01 DOTA
Python内置函数Type()函数一个有趣的用法
2015/02/18 Python
Python httplib模块使用实例
2015/04/11 Python
Python发送以整个文件夹的内容为附件的邮件的教程
2015/05/06 Python
Python tkinter label 更新方法
2018/10/11 Python
PyCharm+PySpark远程调试的环境配置的方法
2018/11/29 Python
Python 异步协程函数原理及实例详解
2019/11/13 Python
Python unittest单元测试openpyxl实现过程解析
2020/05/27 Python
Django:使用filter的pk进行多值查询操作
2020/07/15 Python
canvas版人体时钟的实现示例
2021/01/29 HTML / CSS
英国袜子店:Sock Shop
2017/01/11 全球购物
英国男士时尚网站:Dandy Fellow
2018/02/09 全球购物
艺术用品:Arteza
2018/11/25 全球购物
Converse匡威法国官网:美国著名帆布鞋品牌
2018/12/05 全球购物
荷叶圆圆教学反思
2014/02/01 职场文书
趣味游戏活动方案
2014/02/07 职场文书
运动会加油稿100字
2014/09/19 职场文书