
PHP-次方
我們都知道如果在php里面想計(jì)算2的n次方一般都會(huì)用采用系統(tǒng)內(nèi)置函數(shù)pow(),或者手動(dòng)寫一個(gè)for循環(huán)去處理
echo pow(2,32); //4294967296
$a=2; for ($i=1;$i<=31;$i++){
$a*=2;
} echo $a; //4294967296
但是如果要求計(jì)算2的100次方或者3的100次方該怎么辦?如果還用上述方法的話肯定會(huì)溢出,無(wú)法按正常位數(shù)顯示出來(lái),如在32位機(jī)只能算到最大42億左右,但php這里如果溢出的話會(huì)用科學(xué)記數(shù)法表示.
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、 使用數(shù)學(xué)擴(kuò)展庫(kù) bcpow() 函數(shù),求高精確度數(shù)字次方值
echo bcpow(2,100); //1267650600228229401496703205376 echo bcpow(3,100); //515377520732011331036461129765621272702107522001
2、用代碼實(shí)現(xiàn)乘法公式,就是把乘法筆算用程序去實(shí)現(xiàn),一位一位去乘,如果有進(jìn)位則往數(shù)組不斷的填充,這樣的話無(wú)論乘到多少位,數(shù)組都能容得下,不會(huì)溢出.
//初始化數(shù)組里面只有一位就是2 //之后循環(huán)乘于2會(huì)不斷的進(jìn)行進(jìn)位往數(shù)組里面填充 //例: array(2)、array(4)、array(8)、array(6,1) $num = array(2);
$power = 2;
$bit = 1; //循環(huán)次數(shù)99就相當(dāng)于100次方 //2*2 = 4 //4*2 = 8 //8*2 = 16 for($i=0;$i<99;$i++){ //按乘法公式計(jì)算,每一位乘于2 for($j=0; $j < $bit; $j++){
$n = $power * $num[$j] + $c; if (strlen($n) == 2){ //等于2則代表有進(jìn)位 $num[$j] = substr($n,1,1);
$c = substr($n,0,1); //進(jìn)位 }else{
$num[$j] = $n;
$c = 0;
}
} //如果最后一位算完,有進(jìn)位 if ($c){
$num[$j] = $c; //保存進(jìn)位 $c = 0;
$bit++; //當(dāng)前位數(shù)加一 }
} echo strrev(join('',$num)); //1267650600228229401496703205376哈爾濱品用軟件有限公司致力于為哈爾濱的中小企業(yè)制作大氣、美觀的優(yōu)秀網(wǎng)站,并且能夠搭建符合百度排名規(guī)范的網(wǎng)站基底,使您的網(wǎng)站無(wú)需額外費(fèi)用,即可穩(wěn)步提升排名至首頁(yè)。歡迎體驗(yàn)最佳的哈爾濱網(wǎng)站建設(shè)。
