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 google或baidu分页代码
Nov 26 PHP
PHP SEO优化之URL优化方法
Apr 21 PHP
php魔术方法与魔术变量、内置方法与内置变量的深入分析
Jun 03 PHP
基于empty函数的输出详解
Jun 17 PHP
Laravel 5框架学习之日期,Mutator 和 Scope
Apr 08 PHP
thinkphp如何获取客户端IP
Nov 03 PHP
joomla数据库操作示例代码
Jan 06 PHP
PHP中创建和编辑Excel表格的方法
Sep 13 PHP
tp5(thinkPHP5)框架实现多数据库查询的方法
Jan 10 PHP
Thinkphp 框架扩展之应用模式实现方法分析
Apr 27 PHP
PHP常用字符串函数用法实例总结
Jun 04 PHP
如何通过Apache在本地配置多个虚拟主机
Jul 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
使用gd库实现php服务端图片裁剪和生成缩略图功能分享
2013/12/25 PHP
php相对当前文件include其它文件的方法
2015/03/13 PHP
php获取'/'传参的值简单方法
2017/07/13 PHP
js 内存释放问题
2010/04/25 Javascript
JS增加行复制行删除行的实现代码
2013/11/09 Javascript
详解JS 比较两个Json对象的值是否相等的实例
2013/11/20 Javascript
javascript匿名函数应用示例介绍
2014/03/07 Javascript
jQuery的css() 方法使用指南
2015/05/03 Javascript
XML、HTML、CSS与JS的区别整理
2016/02/18 Javascript
bootstrap读书笔记之CSS组件(上)
2016/10/17 Javascript
利用JavaScript如何查询某个值是否数组内
2017/07/30 Javascript
Vue的Class与Style绑定的方法
2017/09/01 Javascript
Vue + element 实现多选框组并保存已选id集合的示例代码
2020/06/03 Javascript
Python查询Mysql时返回字典结构的代码
2012/06/18 Python
解析Python中的生成器及其与迭代器的差异
2016/06/20 Python
Python实现修改文件内容的方法分析
2018/03/25 Python
解决python3 HTMLTestRunner测试报告中文乱码的问题
2018/12/17 Python
python里 super类的工作原理详解
2019/06/19 Python
Python秒算24点实现及原理详解
2019/07/29 Python
python2爬取百度贴吧指定关键字和图片代码实例
2019/08/14 Python
python-opencv获取二值图像轮廓及中心点坐标的代码
2019/08/27 Python
python字符串下标与切片及使用方法
2020/02/13 Python
python异常处理之try finally不报错的原因
2020/05/18 Python
Python爬虫之Selenium警告框(弹窗)处理
2020/12/04 Python
香港时尚女装购物网站:ZAFUL
2017/07/19 全球购物
美国宠物用品网站:Value Pet Supplies
2018/03/17 全球购物
奥地利时尚、美容、玩具和家居之家:Kastner & Öhler
2020/04/26 全球购物
毕业生如何写自我鉴定
2014/03/15 职场文书
音乐幼师求职信
2014/07/09 职场文书
员工手册编写范本
2015/05/14 职场文书
文书工作总结(范文)
2019/07/11 职场文书
python学习之panda数据分析核心支持库
2021/05/07 Python
Python基础之元编程知识总结
2021/05/23 Python
Python并发编程实例教程之线程的玩法
2021/06/20 Python
Java中Quartz高可用定时任务快速入门
2022/04/03 Java/Android
python中mongodb包操作数据库
2022/04/19 Python