PHP -- four arithmetic operation
PHP 生成 简单四则运算。
Thanks for Open Source.
本代码基于 jiaych php四则运算计算函数 实现。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <?php 2 /*基于jiaych php四则运算计算函数 3 http://download.csdn.net/user/jiaych 实现 4 5 */ 6 class randmath 7 { 8 //$num 数字个数,$nsize 数字位数 9 public function creatmath($num, $nsize) 10 { 11 $str_num = rand(0, pow(10,$nsize)); 12 for ($i = 1; $i < $num; $i++) { 13 $str_t=rand(0, pow(10,$nsize)); 14 15 $str_num = $this->rand_num($str_num, rand(0, pow(10,$nsize))); 16 17 } 18 return $str_num; 19 } 20 //生成四则运算符号 21 function rand_num($str1, $str2) 22 { 23 $s_num = rand(1, 4); 24 $str=""; 25 switch ($s_num) { 26 case 1: //+ 27 $str= $str1 . "+" . $str2; 28 break; 29 case 2: //- 30 $str= $str1 . "-" . $str2; 31 break; 32 case 3: //* 33 $str= $str1 . "*" . $str2; 34 break; 35 case 4: // / 36 $str= $str1 . "/" . $str2; 37 break; 38 /* case 5: //() 39 echo "</br>" . $s_num; 40 return $str1."+".$str2; 41 break; */ 42 } 43 return $str; 44 } 45 } 46 class math_rpn { 47 48 function exp2rpn($expression){ 49 50 $_stack = array('#'); 51 $_rpnexp = array(); 52 $_operator = array('(', '+', '-', '*', '/', ')'); 53 $_priority = array('#' => 0, '(' => 10, '+' => 20, '-' => 20, '*' => 30, '/' => 30); 54 $data=''; 55 $len = strlen($expression); 56 57 for($i = 0; $i < $len; $i++) { 58 $char = substr($expression, $i, 1); 59 60 if ($char == '(') { 61 $_stack[] = $char; 62 continue; 63 } else if ( ! in_array($char, $_operator)) { 64 $data.=$char; 65 if($i+1<$len) 66 { 67 $next = substr($expression, $i+1, 1); 68 if(in_array($next, $_operator)||is_null($next)) 69 { 70 $_rpnexp[] = $data; 71 $data=null; 72 } 73 } 74 else 75 { 76 $_rpnexp[] = $data; 77 $data=null; 78 } 79 continue; 80 } else if ($char == ')') { 81 for($j = count($_stack); $j >= 0; $j--) { 82 $tmp = array_pop($_stack); 83 if ($tmp == "(") { 84 break; 85 } else { 86 $_rpnexp[] = $tmp; 87 } 88 } 89 continue; 90 } else if ($_priority[$char] <= $_priority[end($_stack)]) { 91 $_rpnexp[] = array_pop($_stack); 92 $_stack[] = $char; 93 continue; 94 } else { 95 $_stack[] = $char; 96 continue; 97 } 98 } 99 100 for($i = count($_stack); $i >= 0; $i--) { 101 if (end($_stack) == '#') break; 102 $_rpnexp[] = array_pop($_stack); 103 } 104 $mystack=array(); 105 foreach($_rpnexp as $ret) 106 { 107 if($ret=="+") 108 { 109 $tmp_a=array_pop($mystack); 110 $tmp_b=array_pop($mystack); 111 $mystack[]=$tmp_a+$tmp_b; 112 } 113 else if($ret=="-") 114 { 115 $tmp_a=array_pop($mystack); 116 $tmp_b=array_pop($mystack); 117 $mystack[]=$tmp_b-$tmp_a; 118 } 119 else if($ret=="*") 120 { 121 $tmp_a=array_pop($mystack); 122 $tmp_b=array_pop($mystack); 123 $mystack[]=$tmp_b*$tmp_a; 124 } 125 else if($ret=="/") 126 { 127 $tmp_a=array_pop($mystack); 128 $tmp_b=array_pop($mystack); 129 $mystack[]=$tmp_b/$tmp_a; 130 } 131 else 132 { 133 $mystack[]=$ret; 134 } 135 } 136 return $mystack[0]; 137 } 138 }//测试实例 139 /*$expression = "(10.1+3)*(15)-1.4+5"; 140 echo $expression."="; 141 $mathrpn = new math_rpn(); 142 echo $mathrpn->exp2rpn($expression)."</br>"; 143 */ 144 // $rand_math = new randmath(); 145 // echo $rand_math->creatmath(4, 2); 146 ?>
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 <?php 2 header("Content-type: text/html; charset=utf-8"); 3 include("randmath.php"); 4 5 $mathrpn = new math_rpn(); 6 $rand_math = new randmath();//生成随机式子 7 8 $i=10; 9 while($i>0) 10 { 11 $rand_formula = $rand_math->creatmath(4, 1);//生成随机式子方法($num 数字个数,$nsize 数字位数) 12 $math_result=$mathrpn->exp2rpn($rand_formula); 13 if(is_int($math_result)&$math_result>0) 14 { 15 $i--; 16 echo $rand_formula . "=" . $math_result."</br>"; 17 } 18 } 19 ?>
这样就能生成简单四则运算了。