php实现数值的整数次方
一、总结
没有考虑到指数为负数的情况
二、php实现数值的整数次方
题目描述:
给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。
代码一(phpAC):
1 <?php 2 3 function Power($base, $exponent) 4 { 5 6 if($exponent >= 0){ 7 $res = 1; 8 while($exponent >= 1){ 9 $res = $res * $base; 10 $exponent--; 11 } 12 return $res; 13 } 14 if($exponent < 0){ 15 $exponent2 = abs($exponent); 16 $res = 1; 17 while($exponent2 >=1){ 18 $res = $res *$base; 19 $exponent2--; 20 } 21 return 1/$res; 22 23 } 24 25 }
代码二(javaAC):
1 /** 2 * 1.全面考察指数的正负、底数是否为零等情况。 3 * 2.写出指数的二进制表达,例如13表达为二进制1101。 4 * 3.举例:10^1101 = 10^0001*10^0100*10^1000。 5 * 4.通过&1和>>1来逐位读取1101,为1时将该位代表的乘数累乘到最终结果。 6 */ 7 public double Power(double base, int n) { 8 double res = 1,curr = base; 9 int exponent; 10 if(n>0){ 11 exponent = n; 12 }else if(n<0){ 13 if(base==0) 14 throw new RuntimeException("分母不能为0"); 15 exponent = -n; 16 }else{// n==0 17 return 1;// 0的0次方 18 } 19 while(exponent!=0){ 20 if((exponent&1)==1) 21 res*=curr; 22 curr*=curr;// 翻倍 23 exponent>>=1;// 右移一位 24 } 25 return n>=0?res:(1/res); 26 }
代码三(php快速幂):
<?php //算法:肯定用快速幂啊 $arr = array(1);//还是写记忆化递归 function Power($base, $exponent) { global $arr; $arr[1]=$base; if($arr[$exponent]) return $arr[$exponent]; //这样就不用写那个赋初值记忆化数组为-1的循环了 else{ if($exponent%2==1) return $arr[$exponent]=Power($base, intval($exponent/2))*Power($base, intval($exponent/2))*$base; else return $arr[$exponent]=Power($base, intval($exponent/2))*Power($base, intval($exponent/2)); } }
这个代码-2,3都没过
2,-3也过不了
四、其它
Notice: Undefined offset: 14 in D:softwarecodephpStudy2018PHPTutorialWWWindex.php on line 8 Notice: Undefined offset: 7 in D:softwarecodephpStudy2018PHPTutorialWWWindex.php on line 8 Notice: Undefined offset: 3 in D:softwarecodephpStudy2018PHPTutorialWWWindex.php on line 8 16384Array ( [0] => 1 [1] => -2 [3] => -8 [7] => -128 [14] => 16384 ) Hello World
这是因为数组没定义这个数组的偏移量,也就是