星期二, 12月 08, 2009

大數運算 - 加法

加法算法:首先將第一個數和第二個數字的每個位數(個位數、十位數、百位數、千位數…),放進陣列內。之後將第一個數和第二個數的每個位數的陣列值相加,在放進另外一個加總的新陣列內。之後判斷是否大於10,大於10,則上位數進位,自己減10 (n - 10) 或除以10取餘數($n  % 10)。


<?php
class BigInteger
{
    
public static function add ($a$b)
    {
        
$al strlen($a);
        
$bl strlen($b);
        
// 取最大的數值長度
        
$len $al $bl $al $bl;

        for (
$i 0$i $len$i ++) {
            
// 將每個位數相加,並放入陣列內
            
$c[$i] += $a[$al $i 1] + $b[$bl $i 1];
            if (
$c[$i] >= 10) { // 當資料大於10的時候,作一下數字處理
                
$c[$i 1] += 1// 上一位數進位 + 1
                
$c[$i] = $c[$i] % 10// 本位數取個位數
            
}
        }
        return 
strrev(implode(""$c));
    }
}
// BC Math 驗證
$a "391283198283172381723898213";
$b "7890123456789012345623423";
echo 
"BC Math    => ".bcadd($a$b);
echo 
"\r\n";
echo 
"BigInteger => ".BigInteger::add($a$b);
?>



結果:
BC Math => 399173321739961394069521636
BigInteger => 399173321739961394069521636
 
這樣整個運算,最大的位數就是看程式語言支援的陣列可儲存的大小了。


沒有留言:

張貼留言

我的意見