PHP-次方

我们都知道如果在php里面想计算2的n次方一般都会用采用系统内置函数pow(),或者手动写一个for循环去处理

echo pow(2,32); //4294967296
$a=2; for ($i=1;$i<=31;$i++){
     $a*=2;
  } echo $a; //4294967296

但是如果要求计算2的100次方或者3的100次方该怎么办?如果还用上述方法的话肯定会溢出,无法按正常位数显示出来,如在32位机只能算到最大42亿左右,但php这里如果溢出的话会用科学记数法表示.

echo pow(2,100); //1.2676506002282E+30 echo pow(3,100); //5.1537752073201E+47
$a=2; for ($i=1;$i<=99;$i++){
     $a*=2;
  } echo $a; //1.2676506002282E+30

解决方法:
1、 使用数学扩展库 bcpow() 函数,求高精确度数字次方值

echo bcpow(2,100); //1267650600228229401496703205376 echo bcpow(3,100); //515377520732011331036461129765621272702107522001

2、用代码实现乘法公式,就是把乘法笔算用程序去实现,一位一位去乘,如果有进位则往数组不断的填充,这样的话无论乘到多少位,数组都能容得下,不会溢出.

//初始化数组里面只有一位就是2 //之后循环乘于2会不断的进行进位往数组里面填充 //例: array(2)、array(4)、array(8)、array(6,1) $num = array(2); 
$power = 2;      
$bit = 1; //循环次数99就相当于100次方 //2*2 = 4  //4*2 = 8 //8*2 = 16 for($i=0;$i<99;$i++){ //按乘法公式计算,每一位乘于2 for($j=0; $j < $bit; $j++){ 
           $n = $power * $num[$j] + $c; if (strlen($n) == 2){ //等于2则代表有进位 $num[$j] = substr($n,1,1);
               $c = substr($n,0,1); //进位 }else{
               $num[$j] = $n;
               $c = 0;
           }
       } //如果最后一位算完,有进位 if ($c){
           $num[$j] = $c; //保存进位 $c = 0;
           $bit++; //当前位数加一 }
} echo strrev(join('',$num)); //1267650600228229401496703205376

  哈尔滨品用软件有限公司致力于为哈尔滨的中小企业制作大气、美观的优秀网站,并且能够搭建符合百度排名规范的网站基底,使您的网站无需额外费用,即可稳步提升排名至首页。欢迎体验最佳的哈尔滨网站建设