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 相关文章推荐
建立文件交换功能的脚本(三)
Oct 09 PHP
PHP实现今天是星期几的几种写法
Sep 26 PHP
2个自定义的PHP in_array 函数,解决大量数据判断in_array的效率问题
Apr 08 PHP
php连接与操作PostgreSQL数据库的方法
Dec 25 PHP
php计划任务之ignore_user_abort函数实现方法
Jan 08 PHP
Yii2创建多界面主题(Theme)的方法
Oct 08 PHP
php 如何禁用eval() 函数实例详解
Dec 01 PHP
php 函数使用可变数量的参数方法
May 02 PHP
PHP后端银联支付及退款实例代码
Jun 23 PHP
Laravel 5.4向IoC容器中添加自定义类的方法示例
Aug 15 PHP
Laravel框架使用Seeder实现自动填充数据功能
Jun 13 PHP
对laravel的session获取与存取方法详解
Oct 08 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使用反射插入对象示例分享
2014/03/11 PHP
php生成随机数/生成随机字符串的方法小结【5种方法】
2020/05/27 PHP
JavaScript 事件查询综合
2009/07/13 Javascript
javascript简易缓动插件(源码打包)
2012/02/16 Javascript
js中的push和join方法使用介绍
2013/10/08 Javascript
jQuery中DOM树操作之复制元素的方法
2015/01/23 Javascript
基于jQuery实现拖拽图标到回收站并删除功能
2015/11/25 Javascript
详细探究ES6之Proxy代理
2016/07/22 Javascript
jQuery插件echarts去掉垂直网格线用法示例
2017/03/03 Javascript
强大的 Angular 表单验证功能详细介绍
2017/05/23 Javascript
微信小程序对接七牛云存储的方法
2017/07/30 Javascript
浅谈node的事件机制
2017/10/09 Javascript
详解Vue2 SSR 缓存 Api 数据
2017/11/20 Javascript
javaScript中的空值和假值
2017/12/18 Javascript
解决element UI 自定义传参的问题
2018/08/22 Javascript
Vue实现远程获取路由与页面刷新导致404错误的解决
2019/01/31 Javascript
jquery实现简单每周轮换的日历
2020/09/10 jQuery
详解Vite的新体验
2021/02/22 Javascript
[02:04]2018DOTA2亚洲邀请赛Secret赛前采访
2018/04/03 DOTA
python类定义的讲解
2013/11/01 Python
python使用SMTP发送qq或sina邮件
2017/10/21 Python
python指定写入文件时的编码格式方法
2018/06/07 Python
浅谈Series和DataFrame中的sort_index方法
2018/06/07 Python
Sanic框架基于类的视图用法示例
2018/07/18 Python
python实现对任意大小图片均匀切割的示例
2018/12/05 Python
Python3 requests文件下载 期间显示文件信息和下载进度代码实例
2019/08/16 Python
Python制作数据预测集成工具(值得收藏)
2020/08/21 Python
Python 的 f-string 可以连接字符串与数字的原因解析
2021/02/20 Python
俄罗斯大型在线书店:Читай-город
2019/10/10 全球购物
澳大利亚在线划船、露营和钓鱼商店:BCF Australia
2020/03/22 全球购物
优秀医生事迹材料
2014/02/12 职场文书
大学生求职信
2014/06/17 职场文书
民主评议党员自我评价材料
2014/09/18 职场文书
2016公司中秋节寄语
2015/12/07 职场文书
使用redis实现延迟通知功能(Redis过期键通知)
2021/09/04 Redis
python中的getter与setter你了解吗
2022/03/24 Python