PHP实现的分解质因数操作示例


Posted in PHP onAugust 01, 2018

本文实例讲述了PHP实现的分解质因数操作。分享给大家供大家参考,具体如下:

思路:

如果要计算$num的质数,则至少收集$num以内的质数数组,判断$num是否在质数数组里:

如果否,则判断当前质数$zhishu[$i]是否能再次将整除后的数整除,如果能,则质数数组“游标”不移动(还让当前质数$zhishu[$i]对被整除后的数取模)

如果不能(再次将整除后的数整除),则用下一个质数(让$i++)去测试是否整除。如果否($num在质数数组里),则表示$num本身就是个质数,直接echo之。(思路看得糊涂的话,直接看代码吧)

首先:用一个函数收集一定范围内的质数放到数组里返回。(把1从质数里剔除,从2开始算质数),代码和注释如下:

//得到1000以内的质数
function get_zhishu($num=1000){
  $num = floor($num);
  $zhishu = array();
  //先得到1000以内的质数
  for($i=1; $i<=$num; $i++){
    $flag = true; //当flag为false时表示该数不是素数
    for($j=2; $j<$num; $j++){ //$j从2开始,因为除数为1时,肯定能整除
      if($i>$j){ //$j如果比$i还大,取模肯定不为0,没有比较的意义
        $mod = $i%$j;
        if($mod == 0 ){ //当除数$j为$i以内时,如果取模为0,表示该数不是素数
          $flag = false;
        }
      }
    }
    if($flag){
      array_push($zhishu, $i);//如果$flag为真,则$i是质数
    }
  }
  array_shift($zhishu); //把1从质数数组中剔除
  return $zhishu;
}
$zhishu = get_zhishu(1000); //得到1到1000之内的质数

然后:从质数数组中,挨个取出(从最小的质数开始)符合条件(能被整除)的质数。代码和注释如下:

/**
 * @param int $num 要分解的质数
 * @param array $zhishu 1000以内的质数数组
 * @param int $i 相当于质数数组的"游标"
 * @author misaka去年夏天
 */
function fenjie_num($num, $zhishu, $i=0){
  if(!is_int($num) || $num<0){
    exit('请输入正整数!');
  }
  if(in_array($num, $zhishu)){ //如果该数为质数,则echo之
    echo $num,'<br />';
  }else{
    $ceil = ceil($num/$zhishu[$i]);
    if($ceil == ($num/$zhishu[$i])){
      echo $zhishu[$i],'<br />';
      if($ceil%$zhishu[$i]!=0){
        //如果当前质数还能被$ceil整除,则继续用该质数(不用$i++),比如90分解为2、3、3、5,否则让$i++再递归
        $i++;
      }
      fenjie_num((int)$ceil, $zhishu, $i);
    }else{
      fenjie_num($num, $zhishu, $i+1); //对于99这样的,不是质数,但也没第一次被整除的,用下一个质数($i++)测试它
    }
  }
}
fenjie_num(390, $zhishu);

运行结果:

2
3
5
13

PS:这里再为大家推荐几款计算工具供大家进一步参考借鉴:

在线分解质因数计算器工具:
http://tools.3water.com/jisuanqi/factor_calc

在线一元函数(方程)求解计算工具:
http://tools.3water.com/jisuanqi/equ_jisuanqi

科学计算器在线使用_高级计算器在线计算:
http://tools.3water.com/jisuanqi/jsqkexue

在线计算器_标准计算器:
http://tools.3water.com/jisuanqi/jsq

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
php xml常用函数的集合(比较详细)
Jun 06 PHP
PHP Session 变量的使用方法详解与实例代码
Sep 11 PHP
php缓冲 output_buffering和ob_start使用介绍
Jan 30 PHP
php使用正则过滤js脚本代码实例
May 10 PHP
PHP错误Warning: Cannot modify header information - headers already sent by解决方法
Sep 27 PHP
PHP使用http_build_query()构造URL字符串的方法
Apr 02 PHP
thinkPHP5.0框架自动加载机制分析
Mar 18 PHP
PHP实现浏览器中直接输出图片的方法示例
Mar 14 PHP
PHP钩子实现方法解析
May 21 PHP
php写入mysql中文乱码的实例解决方法
Sep 17 PHP
Laravel开启跨域请求的方法
Oct 13 PHP
实例化php类时传参的方法分析
Jun 05 PHP
Laravel中为什么不使用blpop取队列详析
Aug 01 #PHP
Laravel5.5以下版本中如何自定义日志行为详解
Aug 01 #PHP
PHP实现随机数字、字母的验证码功能
Aug 01 #PHP
PHP使用XMLWriter读写xml文件操作详解
Jul 31 #PHP
laravel + vue实现的数据统计绘图(今天、7天、30天数据)
Jul 31 #PHP
PHP常用日期加减计算方法实例小结
Jul 31 #PHP
ThinkPHP5.0多个文件上传后找不到临时文件的修改方法
Jul 30 #PHP
You might like
php链表用法实例分析
2015/07/09 PHP
php基于CodeIgniter实现图片上传、剪切功能
2016/05/14 PHP
CI框架的安全性分析
2016/05/18 PHP
php解决DOM乱码的方法示例代码
2016/11/20 PHP
JS 实现双色表格实现代码
2009/11/24 Javascript
JavaScript在IE和Firefox(火狐)的不兼容问题解决方法小结
2010/04/13 Javascript
JS onmousemove鼠标移动坐标接龙DIV效果实例
2013/12/16 Javascript
基于jQuery实现交互体验社会化分享代码附源码下载
2016/01/04 Javascript
基于jQuery实现多标签页切换的效果(web前端开发)
2016/07/24 Javascript
利用原生JS自动生成文章标题树的实例
2016/08/22 Javascript
js制作支付倒计时页面
2016/10/21 Javascript
老生常谈jacascript DOM节点获取
2017/04/17 Javascript
浅谈Vue组件及组件的注册方法
2018/08/24 Javascript
vuex 解决报错this.$store.commit is not a function的方法
2018/12/17 Javascript
vue组件开发之slider组件使用详解
2020/08/21 Javascript
vscode+gulp轻松开发小程序的完整步骤
2020/10/18 Javascript
[49:27]LGD vs OG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python单例模式实例分析
2015/01/14 Python
Python中处理时间的几种方法小结
2015/04/09 Python
关于Python面向对象编程的知识点总结
2017/02/14 Python
PyQt5每天必学之创建窗口居中效果
2018/04/19 Python
python3读取csv和xlsx文件的实例
2018/06/22 Python
python和pywin32实现窗口查找、遍历和点击的示例代码
2020/04/01 Python
python用TensorFlow做图像识别的实现
2020/04/21 Python
Python生成器传参数及返回值原理解析
2020/07/22 Python
pycharm激活方法到2099年(激活流程)
2020/09/22 Python
linux比较文件内容的命令是什么
2015/09/23 面试题
高效课堂标语
2014/06/26 职场文书
2015元旦联欢晚会结束语
2014/12/14 职场文书
五年级学生评语大全
2014/12/26 职场文书
实习单位指导教师评语
2014/12/30 职场文书
大学开学感言
2015/08/01 职场文书
pytorch 如何使用batch训练lstm网络
2021/05/28 Python
Docker 镜像介绍以及commit相关操作
2022/04/13 Servers
MySQL count(*)统计总数问题汇总
2022/09/23 MySQL
MySQL中的 inner join 和 left join的区别解析(小结果集驱动大结果集)
2023/05/08 MySQL