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 文件夹删除、php清除缓存程序
Aug 25 PHP
php下尝试使用GraphicsMagick的缩略图功能
Jan 01 PHP
基于PHP CURL获取邮箱地址的详解
Jun 03 PHP
两种设置php载入页面时编码的方法
Jul 29 PHP
thinkphp的URL路由规则与配置实例
Nov 26 PHP
Yii框架关联查询with用法分析
Dec 02 PHP
php数值转换时间及时间转换数值用法示例
May 18 PHP
深入浅析PHP的session反序列化漏洞问题
Jun 15 PHP
laravel自定义分页效果
Jul 23 PHP
PHP实现驼峰样式字符串(首字母大写)转换成下划线样式字符串的方法示例
Aug 10 PHP
总结PHP中初始化空数组的最佳方法
Feb 13 PHP
Yii框架的布局文件实例分析
Sep 04 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用数组返回无限分类的列表数据的代码
2010/08/08 PHP
php结合mysql与mysqli扩展处理事务的方法
2016/06/29 PHP
php实现的数组转xml案例分析
2019/09/28 PHP
用js+xml自动生成表格的东西
2006/12/21 Javascript
javascript和jquery修改a标签的href属性
2013/12/16 Javascript
Javascript实现图片轮播效果(二)图片序列节点的控制实现
2016/02/17 Javascript
简易的JS计算器实现代码
2016/10/18 Javascript
Vue.js 递归组件实现树形菜单(实例分享)
2016/12/21 Javascript
jQuery日期范围选择器附源码下载
2017/05/23 jQuery
React-Native使用Mobx实现购物车功能
2017/09/14 Javascript
react-native组件中NavigatorIOS和ListView结合使用的方法
2017/09/30 Javascript
Vue2.0 http请求以及loading展示实例
2018/03/06 Javascript
js序列化和反序列化的使用讲解
2019/01/19 Javascript
vue日历/日程提醒/html5本地缓存功能
2019/09/02 Javascript
jQuery实现form表单基于ajax无刷新提交方法实例代码
2019/11/04 jQuery
浅析AST抽象语法树及Python代码实现
2016/06/06 Python
python 遍历字符串(含汉字)实例详解
2017/04/04 Python
用python处理MS Word的实例讲解
2018/05/08 Python
使用python实现数组、链表、队列、栈的方法
2019/12/20 Python
Python中Selenium库使用教程详解
2020/07/23 Python
pandas按照列的值排序(某一列或者多列)
2020/12/13 Python
使用Python封装excel操作指南
2021/01/29 Python
Python3+PyCharm+Django+Django REST framework配置与简单开发教程
2021/02/16 Python
CSS实现圆形放大镜狙击镜效果 只有圆圈里的放大
2012/12/10 HTML / CSS
HTML5 在canvas中绘制矩形附效果图
2014/06/23 HTML / CSS
英国舒适型鞋履品牌:FitFlop
2017/05/17 全球购物
竞争性谈判邀请书
2014/02/06 职场文书
企业晚会策划方案
2014/05/29 职场文书
治安消防安全责任书
2014/07/23 职场文书
幼儿生日活动方案
2014/08/27 职场文书
农民工工资支付承诺书
2015/05/04 职场文书
运动会通讯稿50字
2015/07/20 职场文书
工伤调解协议书
2016/03/21 职场文书
话题作文之呼唤
2019/12/18 职场文书
Go语言中的UTF-8实现
2021/04/26 Golang
详解vue中v-for的key唯一性
2021/05/15 Vue.js