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 裁剪图片成固定大小代码方法
Sep 09 PHP
php图片上传存储源码并且可以预览
Aug 26 PHP
采用PHP函数memory_get_usage获取PHP内存清耗量的方法
Dec 06 PHP
一些php项目中比较通用的php自建函数的详解
Jun 06 PHP
php curl获取网页内容(IPV6下超时)的解决办法
Jul 16 PHP
php生成html文件方法总结
Dec 01 PHP
深入剖析浏览器退出之后php还会继续执行么
May 17 PHP
PHP自定义函数实现格式化秒的方法
Sep 14 PHP
yii 2.0中表单小部件的使用方法示例
May 23 PHP
用Laravel Sms实现laravel短信验证码的发送的实现
Nov 29 PHP
PHP实时统计中文字数和区别
Feb 28 PHP
如何在PHP中读写文件
Sep 07 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中常用编辑器推荐
2007/01/02 PHP
php 信息采集程序代码
2009/03/17 PHP
PHP获取url的函数代码
2011/08/02 PHP
PHP中的strtr函数使用介绍(str_replace)
2011/10/20 PHP
php中json_decode()和json_encode()的使用方法
2012/06/04 PHP
PHP基于进程控制函数实现多线程
2020/12/09 PHP
关于图片的预加载过程中隐藏未知的
2012/12/19 Javascript
javascript 使用 NodeList需要注意的问题
2013/03/04 Javascript
javascript移动设备Web开发中对touch事件的封装实例
2014/06/05 Javascript
jquery简单的弹出层浮动层代码
2015/04/27 Javascript
jquery+ajax请求且带返回值的代码
2015/08/12 Javascript
Vue.js组件tree实现省市多级联动
2016/12/02 Javascript
基于rollup的组件库打包体积优化小结
2018/06/18 Javascript
React Native基础入门之初步使用Flexbox布局
2018/07/02 Javascript
jQuery实现的网站banner图片无缝轮播效果完整实例
2019/01/28 jQuery
如何在Node和浏览器控制台中打印彩色文字
2020/01/09 Javascript
使用pdb模块调试Python程序实例
2015/06/02 Python
Python机器学习之决策树算法实例详解
2017/12/06 Python
Appium Python自动化测试之环境搭建的步骤
2019/01/23 Python
Python+OpenCV图片局部区域像素值处理改进版详解
2019/01/23 Python
如何在keras中添加自己的优化器(如adam等)
2020/06/19 Python
高中毕业生自我鉴定
2013/11/03 职场文书
怎样写留学自荐信
2013/11/11 职场文书
乐观大学生的自我评价
2014/01/10 职场文书
聚美优品广告词改编
2014/03/14 职场文书
2014年五四青年节活动方案
2014/03/29 职场文书
社区党员志愿服务活动方案
2014/08/18 职场文书
基层党组织建设整改方案
2014/09/16 职场文书
社保缴纳证明申请书
2014/11/03 职场文书
酒会邀请函
2015/01/31 职场文书
2015年度电厂个人工作总结
2015/05/13 职场文书
2015年度酒店客房部工作总结
2015/05/25 职场文书
通讯稿范文
2015/07/22 职场文书
小学英语教学随笔
2015/08/14 职场文书
2016年寒假社会实践活动总结
2015/10/10 职场文书
Android Flutter实现图片滑动切换效果
2022/04/07 Java/Android