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 相关文章推荐
用cookies来跟踪识别用户
Oct 09 PHP
隐性调用php程序的方法
Mar 09 PHP
处理php自动反斜杠的函数代码
Jan 05 PHP
php数组函数序列之next() - 移动数组内部指针到下一个元素的位置,并返回该元素值
Oct 31 PHP
php全排列递归算法代码
Oct 09 PHP
PHP-redis中文文档介绍
Feb 07 PHP
如何使用PHP批量去除文件UTF8 BOM信息
Aug 05 PHP
CodeIgniter生成网站sitemap地图的方法
Nov 13 PHP
php调整gif动画图片尺寸示例代码分享
Dec 05 PHP
免费的ip数据库淘宝IP地址库简介和PHP调用实例
Apr 08 PHP
php post大量数据时发现数据丢失问题解决方法
Jun 20 PHP
对laravel的csrf 防御机制详解,及form中csrf_token()的存在介绍
Oct 24 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
php实现高效获取图片尺寸的方法
2014/12/12 PHP
phpinfo()中Loaded Configuration File(none)的解决方法
2017/01/16 PHP
javascript 动态参数判空操作
2008/12/22 Javascript
网页打开自动最大化的js代码
2012/08/22 Javascript
扒一扒JavaScript 预解释
2015/01/28 Javascript
javascript实现链接单选效果的方法
2015/05/13 Javascript
基于BootStrap的图片轮播效果展示实例代码
2016/05/23 Javascript
js判断iframe中元素是否存在的实现代码
2016/12/24 Javascript
如何提高Dom访问速度
2017/01/05 Javascript
Vuejs仿网易云音乐实现听歌及搜索功能
2017/03/30 Javascript
Bootstrap Table快速完美搭建后台管理系统
2017/09/20 Javascript
vue-lazyload图片延迟加载插件的实例讲解
2018/02/09 Javascript
javascript严格模式详解(含严格模式与非严格模式的区别)
2019/11/12 Javascript
VUE Elemen-ui之穿梭框使用方法详解
2021/01/19 Javascript
移动端JS实现拖拽两种方法解析
2020/10/12 Javascript
举例讲解Python程序与系统shell交互的方式
2015/04/09 Python
python生成多个只含0,1元素的随机数组或列表的实例
2018/11/12 Python
python实现多张图片拼接成大图
2019/01/15 Python
python生成器用法实例详解
2019/11/22 Python
Python MySQL 日期时间格式化作为参数的操作
2020/03/02 Python
中国最大的潮流商品购物网站:YOHO!BUY有货
2017/01/07 全球购物
奥兰多迪士尼门票折扣:Undercover Tourist
2018/07/09 全球购物
马云的职业生涯规划之路
2014/01/01 职场文书
护士自我评价范文
2014/01/25 职场文书
捐款倡议书范文
2014/02/02 职场文书
致跳远运动员加油稿
2014/02/11 职场文书
安全宣传标语
2014/06/10 职场文书
机关驾驶员违规检讨书
2014/09/13 职场文书
2014年仓库管理员工作总结
2014/11/18 职场文书
2015小学语文教师个人工作总结
2015/05/20 职场文书
工作年限证明模板
2015/06/15 职场文书
护士岗前培训心得体会
2016/01/08 职场文书
《只有一个地球》教学反思
2016/02/16 职场文书
创业计划书之暑假培训班
2019/11/09 职场文书
Nginx静态压缩和代码压缩提高访问速度详解
2022/05/30 Servers