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 相关文章推荐
从零开始 教你如何搭建Discuz!4.1论坛
Jul 07 PHP
php下intval()和(int)转换使用与区别
Jul 18 PHP
PHP 加密解密内部算法
Apr 22 PHP
8个出色的WordPress SEO插件收集
Feb 26 PHP
用PHP读取超大文件的实例代码
Apr 01 PHP
基于AppServ,XAMPP,WAMP配置php.ini去掉警告信息(NOTICE)的方法详解
May 07 PHP
php修改NetBeans默认字体的大小
Jul 02 PHP
php实现简单的MVC框架实例
Sep 23 PHP
PHP中的静态变量及static静态变量使用详解
Nov 05 PHP
YII Framework框架教程之日志用法详解
Mar 14 PHP
PHP单例模式是什么 php实现单例模式的方法
May 14 PHP
php和vue配合使用技巧和方法
May 09 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
安健A254立体声随身听的分析与打磨
2021/03/02 无线电
php SQL防注入代码集合
2008/04/25 PHP
php var_export与var_dump 输出的不同
2013/08/09 PHP
PHP实现多图片上传类实例
2014/07/26 PHP
PHP新特性之字节码缓存和内置服务器
2017/08/11 PHP
Yii框架中用response保存cookie,用request读取cookie的原理解析
2019/09/04 PHP
PHP中类与对象功能、用法实例解读
2020/03/27 PHP
Javascript学习笔记一 之 数据类型
2010/12/15 Javascript
jQuery Clone Bug解决代码
2010/12/22 Javascript
JQuery 文本框回车跳到下一个文本框示例代码
2013/08/30 Javascript
js设置控件的隐藏与显示的两种方法
2014/08/21 Javascript
浅析AngularJS Filter用法
2015/12/28 Javascript
javascript插件开发的一些感想和心得
2016/02/28 Javascript
前端面试题及答案整理(二)
2016/08/26 Javascript
php输出全部gb2312编码内的汉字方法
2017/03/04 Javascript
js实现前端图片上传即时预览功能
2017/08/02 Javascript
Vue中组件之间数据的传递的示例代码
2017/09/08 Javascript
使用puppeteer破解极验的滑动验证码
2018/02/24 Javascript
详解如何搭建mpvue框架搭配vant组件库的小程序项目
2019/05/16 Javascript
微信小程序获取当前位置和城市名
2019/11/13 Javascript
[01:02:25]2014 DOTA2华西杯精英邀请赛5 24 NewBee VS VG
2014/05/25 DOTA
[41:41]TFT vs Secret Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
Python编程对列表中字典元素进行排序的方法详解
2017/05/26 Python
如何在python中使用selenium的示例
2017/12/26 Python
Python socket实现的简单通信功能示例
2018/08/21 Python
python的中异常处理机制
2018/08/30 Python
numpy中的meshgrid函数的使用
2019/07/31 Python
python中图像通道分离与合并实例
2020/01/17 Python
keras训练曲线,混淆矩阵,CNN层输出可视化实例
2020/06/15 Python
Python+Dlib+Opencv实现人脸采集并表情判别功能的代码
2020/07/01 Python
全球知名鞋履品牌授权零售商:Journeys
2016/09/17 全球购物
美国50岁以上单身人士约会平台:SilverSingles
2018/06/29 全球购物
芬兰设计商店美国:Finnish Design Shop US
2019/03/25 全球购物
Deux par Deux官方网站:设计师童装
2020/01/03 全球购物
求职自荐信
2013/12/14 职场文书
党员违纪检讨书
2014/02/18 职场文书