数学算法:求两个数的最大公约数

在求分数的时候,只有求出最大公约数,才能得到最简化的分数
/**
 * 计算两个数的最大公约数
 * @param $num1 整数1
 * @param $num2 整数2
 */
 public function common_num($num1,$num2)
 {
  if($num1 == $num2){
   $num1 = $num2 + 1;
  }
  $min = $num1>$num2 ? $num2:$num1;
  $max = $num1>$num2 ? $num1:$num2;
  $comnum = $this->common_check($max,$min);
  $t = array();
  $t['min'] = $min/$comnum;
  $t['max'] = $max/$comnum;
  return $t;
 }
 public function common_check($max,$min)
 {
  $num = $max%$min;
  if($num == 0){
   return $min;
  }else{
   return $this->common_check($min,$num);
  }
 }
//两个数的最小公倍数是:两数之积除以最大公约数
 
//求一个数的所有因数,哪个数能整除该数,则哪个数就是这个数的因数
$num1 = rand(2,100);
  $arr = array();
  for($i=1; $i<=$num1; $i++)
  {
   if($num1 % $i == 0)
   {
    $arr[] = $i;
   }
  }
 
/*
* 求三个数的最大公约数
* 方法为先求两个数的最大公约数得到com1,再拿com1和第三个数求最大公约数
* 最后得到这三个数的最大公约数为 $com1*$com1即两数之积;
*
* 求三个数的最小公倍数
* 方法为三数之积除以最大公约数
*/
 
 
/**
 * 随机生成一个小数
 * @param $startnum 起始整数
 * @param $endnum 结束整数
 * @param $sdot 起始小数
 * @param $edot 结束小数
 */
 function decimal($startnum,$endnum,$sdot=0,$edot=99)
 {
  $zerostr = "";
  $dotcount = strlen($edot);
  $newnum = rand($startnum,$endnum);
  $newdot = rand($sdot,$edot);
  $zerocount = $dotcount - strlen($newdot);
  //小数位不够的话进行补0
  if($zerocount>0){
   for($i=0; $i<$zerocount; $i++){
    $zerostr .= "0";
   }
  }
  $newdot = $zerostr . $newdot;
  return $newnum . "." . $newdot;
 }
 //判断小数相除值是否是有限,并且小数位<4的
 public function res_limite($start1,$end1,$s1,$e1,$start2,$end2,$s2,$e2)
 {
  $num1 = $this->decimal($start1,$end1,$s1,$e1);
  $num2 = $this->decimal($start2,$end2,$s2,$e2);
  $n = $num1/$num2;
  $length = 4;
  if(!is_int($n) && is_finite($n)){
   $arr = explode('.',$n);
   $length = strlen($arr[1]);
  }
  if(!is_int($n) && $length<4){
   $t = array();
   $t['num1'] = $num1;
   $t['num2'] = $num2;
   return $t;
  }else{
   return $this->res_limite($start1,$end1,$s1,$e1,$start2,$end2,$s2,$e2);
  }
 }
 
 
/**
 * 得到小于1的分数
 */
 public function common_num($num1,$num2)
 {
  if($num1 == $num2){
   $num1 = $num2 + 1;
  }
  $min = $num1>$num2 ? $num2:$num1;
  $max = $num1>$num2 ? $num1:$num2;
  $comnum = $this->common_check($max,$min);
  $t = array();
  $t['min'] = $min/$comnum;
  $t['max'] = $max/$comnum;
  return $t;
 }
 
/*
* 质数和合数
* 100以内的 质数为
* $arr = array(2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97);
*/
//100以内的质数
  $arr = array(2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97);
  $num1 = rand(1,100);
  $count = count($arr);
  $flag = false;
  for($i=0; $i<$count; $i++)
  {
   if(($num1%$arr[$i]==0) && ($num1/$arr[$i]>1))
   {
    $flag = true;
    break;
   }
  }
  if($flag){
   $okanswer = '合数';
   $erranswer = '质数';
  }else{
   $okanswer = '质数';
   $erranswer = '合数';
  }
 

你可能感兴趣的:(最大公约数,数学算法)