• 技术文章 >php教程 >PHP源码

    计算两个整数的最大公约数算法

    PHP中文网PHP中文网2016-05-25 17:00:16原创1057

    1. [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中文网,转载请注明出处,感谢您的尊重!如有疑问,请联系admin@php.cn处理
    专题推荐:php
    上一篇:HTML绝对路径和相对路径 下一篇:无需激活直接同步登入discuz,php代码(直接可用)
    大前端线上培训班

    相关文章推荐

    • 有关在Windows下配置PHP Apache Optimizer失败的问题解决方案• PHP简单购物车代码分享分析• 用PHP实现小写金额转换大写金额【精确到分】• jcrop插件+php实现的图片上传与裁剪• PHP获取指定月份的第一天和最后一天

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网