問題描述和思路:當運算的數字過大時,會溢位範圍,導致最後的結果出錯。
php種整型數的字長和平台有關,32 位平台下的最大值通常最大值是大約二十億,64 位平台下的最大值通常是大約 9e18。在php中,當數字超出整型範圍時,會自動將其轉換為浮點型,浮點數的字長和平台相關,通常最大值是 1.8e308 並具有 14 位十進位制數字的精度。在本題中,雖然範圍是在浮點數內的,但是精度卻不足了,所以需要用別的方法來實現大數的運算,在這裡我們可以使用字串來實現。
//用字串的形式實現數的乘法運算,是我們所熟悉的垂直乘法運算
function multiply(string $a, string $b): string
$j = 0;
for ($inxb = $lenb - 1; $inxb >= 0; --$inxb) else
$re = $mul . $re;
}if ($j > 0) $re = $j . $re;
$result = add($result, $re);
} //去除字串首的0
if($result != '0') $result = preg_replace('/^0+/','',$result);
return $result;
}//用字串的形式實現數的加法運算
function add($a, $b) else
$re = (string)$sum . $re;
}if ($j > 0) $re = (string)$j . $re;
return $re;
}
雖然功能是實現了,但是還是離大佬的水平相差甚遠呀。還是看看大佬的**學習學習吧!
function multiply(string $a, string $b): string
}} //最後以字串的形式輸出
return implode('', array_reverse($r));
}
function multiply(string $a, string $b): string
} //去掉字串首的無效0字元
return preg_replace('/^0+\b/', '', strrev(join($result)));
}
上面兩個大佬寫的思想是一樣的,都是垂直乘法的實現,優化點在於使用了陣列來存放每一位的運算結果,最後再拼接成字串輸出。這裡都是先反轉再運算,雖然這麼做與我們自己筆算時從低位開始算不同,但是能夠防止陣列下標越界,是種更好的辦法。 字串實現加法和乘法
include include using namespace std string add string strleft,string strright for string size type i 0 i strright.size i int carry 0 string size type ...
CStdioFile 以字串形式寫入檔案一行
cstdiofilemfile cfileexception mexcept mfile.open t d test.ini cfile modecreate cfile modenotruncate cfile modewrite,mexcept mfile.seektoend cstring s...
以字串的形式列印list中全部資料
string sid1 request.getparameter sid string 型別的變數轉int型別 int sid integer.parseint sid1 scservice scs new scservice listls scs.getbysid sid string allrs...