Сумма больших чисел

bool

Новичок
Сумма больших чисел

Есть функция, которая получает 2 строки чисел. Делает из них два масива чисел и суммирует поразрадно. Если сумма двух разрядов больше 10, то по идее в текущий элемент масива присваиваит челую часть от деления на 10, проверяет, есть ли следущий елемент, если нет, присваивет 0, и увеличивает на 1.
Для чисел, например, 11 и 8 работает, для чисел 11 и 12 тоже.
Но для 11 и 9 выводит 10?
Помогите, два раза переписывал и ничего.

PHP:
function summ($a = '', $b = '')
{
	for ($i = 0; $i < strlen($a); $i++)
	{
		$c[$i] = $a{$i};
	}
	for ($i = 0; $i < strlen($b); $i++)
	{
		$d[$i] = $b{$i};
	}
	
	$c = array_reverse($c);
	$d = array_reverse($d);
	
	$num_c = sizeof($c);
	$num_d = sizeof($d);
	$min = min($num_c, $num_d);
	$max = max($num_c, $num_d);
	$out = array();
	for ($i = 0; $i < $max; $i++)
	{
		if (empty($d[$i]))
		{
			$d[$i] = 0;
		}
		if (empty($c[$i]))
		{
			$c[$i] = 0;
		}
		
		$out[$i] = intval($d[$i]) + intval($c[$i]);
		
		if ($out[$i] >=10)
		{
			$out[$i] = $out[$i]-10;
			$out[$i+1] = 0;
			$out[$i+1] = $out[$i+1] + 1;
			
		}
	}
	
	return array_reverse($out);
		
	
}
 

Boratustra

Новичок
Попробуй так, вроде работает.
Конечно, там нужны еще различные проверки, но алгоритм вроде такой:
PHP:
function summ($a = '', $b = '', $base = 10)
{
    $a = strrev($a);
    $b = strrev($b);
    if (strlen($a) > strlen($b)) {
      $out = &$a;
      $in = &$b;
    } else {
      $out = &$b;
      $in = &$in;
    }
    $temp = 0;
    $output = Array(0);
    for ($i = 0, $n = strlen($out); $i < $n; $i++) {
      $temp = (integer)$in[$i] + (integer)$out[$i];
      if ($temp >= $base) {
         $output[$i + 1] = 1;
         $temp -= $base;
      }
      $output[$i] += $temp;
    }

    return implode('', array_reverse($output));
}
 

SiMM

Новичок
А воспользоваться [m]GMP[/m] или [m]BC[/m] не пробовал? Или ты это в учебных целях?
 

bool

Новичок
конечно в учебных целях, но все таки, почему не работает моя функция.
 

SelenIT

IT-лунатик :)
bool, когда ты вычисляешь
PHP:
$out[$i] = intval($d[$i]) + intval($c[$i]);
ты не учитываешь, не занес ли туда единицу при предыдущем проходе. Вот она и "пропадает".
 
Сверху