Чат PHP-разработчиков
Сложение очень больших чисел на PHP

Сложение очень больших чисел

В этом задании нужно написать функцию, позволяющую сложить 2 очень больших целых числа.

Так как структура данных в PHP, хранящая числа, ограничена размером, мы не можем сложить, к примеру, 278378473848374873847384738478347483743878 и 23784923428346283472346234623746238423.

Попробуйте выполнить этот код:

<?php
echo 278378473848374873847384738478347483743878 + 23784923428346283472346234623746238423;

Он вернет нам полную ерунду.

Мы даже просто не сможем присвоить большое число в переменную:

<?php
$a = 278378473848374873847384738478347483743878;
var_dump($a);

Этот код тоже не даст нам желаемого результата.

Однако, мы можем записать эти числа в виде строк:

<?php
$a = '278378473848374873847384738478347483743878';
var_dump($a);

И, в общем-то, мы можем написать функцию для сложения двух целых чисел в виде строк. Её интерфейс будет выглядеть следующим образом:

function bigSum(string $x1, string $x2): string

Подсказка #1. К символам строки можно обращаться с помощью квадратных скобок, как будто это элементы массива.

$x1[0] // вернёт первый символ строки

Подсказка #2. Вспомните школу... Если быть точнее, то как там учили складывать числа.

Поехали!

Присоединяйтесь к нам в ВКонтакте и в Facebook, чтобы не пропустить новые уроки. А также вступайте в наш чат PHP-разработчиков в Telegram.
Читайте также
Комментарии (8)


Pavel.Ivatsko
function bigSum(string $x1, string $x2): string {
    $result = bcadd($x1,$x2);
    return $result;
}
ivashkevich

Ну, чёт не. Нужно написать функцию самостоятельно. Вы же просто обернули готовую в другое имя. И непонятно, для чего переменная $result. Можно было просто:

return bcadd($x1, $x2).
SBTesla
$a = '52343245623456243574657436754356754367';
$b = '79687945834597259348572398562395826735209';

function sum ($a, $b)
{
     $c = bcadd($a,$b);
     return $c;
}

$c = sum($a, $b);
echo $c;
ivashkevich

Смотри коммент выше.

virtual2018

код страшненький, но рабочий

function sumBigNumber($bigNumFirst, $bigNumSecond)
{
    $sumBigNum = "";
    $indexFirstNumber = strlen($bigNumFirst) - 1;
    $indexSecondNumber = strlen($bigNumSecond) - 1;
    $indexSum = $transferNum = 0;

    while ($indexFirstNumber >= 0 || $indexSecondNumber >= 0) {
        if ($indexFirstNumber < 0) {
            $sumTemp = (int)($bigNumSecond[$indexSecondNumber] + $transferNum);
        } elseif ($indexSecondNumber < 0) {
            $sumTemp = (int)($bigNumFirst[$indexFirstNumber] + $transferNum);
        } else {
            $sumTemp = (int)($bigNumFirst[$indexFirstNumber] + $bigNumSecond[$indexSecondNumber] + $transferNum);
        }

        if ($sumTemp >= 10) {
            $transferNum = 1;
            $sumTemp = $sumTemp - 10;
        } else {
            $transferNum = 0;
        }
        $sumBigNum[$indexSum] = $sumTemp;
        $indexFirstNumber--;
        $indexSecondNumber--;
        $indexSum++;
    }

    return strrev($sumBigNum);
}
EWA
<?php
function bigSum(string $x1, string $x2): string
{
    $arrX1 = str_split($x1);
    $arrX2 = str_split($x2);
    if (count($arrX1) >= count($arrX2)){
        $i = count($arrX1);
    }else{
        $i = count($arrX2);
    }
    $n = 0;
    $arrayResult = [];
    for($x = 0; $x < $i; $x++){
        $result = array_pop($arrX1) + array_pop($arrX2) + $n;
        $str = (string)$result;
        if($result >= 10){
            $n = 1;
        }else{
            $n = 0;
        }
        array_unshift($arrayResult, $str[$n]);
    }
    if($n == 1){
        array_unshift($arrayResult, $n);
    }
        return implode($arrayResult);
}
echo bigSum('311564432977632588977129875641230255', '2589745632159875325874103698878965421036589');
?>
Evgeniy
<?php

function bigSum(string $x1, string $x2): string
{
    if (empty($x1) || empty($x2)) {
        return $x1 . $x2;
    }

    $len1 = strlen($x1);
    $len2 = strlen($x2);
    $maxLen = max($len1, $len2);

    $carryBit = 0;
    $result = '';

    for ($i = 1; $i <= $maxLen; $i++) {
        ($i > $len1) ? ($digit1 = 0) : ($digit1 = (int)$x1[$len1 - $i]);
        ($i > $len2) ? ($digit2 = 0) : ($digit2 = (int)$x2[$len2 - $i]);
        $sum = (string)($digit1 + $digit2 + $carryBit);
        $result = $sum[strlen($sum) - 1] . $result;
        (strlen($sum) > 1) ? ($carryBit = 1) : ($carryBit = 0);
    }

    return ($carryBit > 0) ? ('1' . $result) : ($result);
}

/*---------------------------------------------*/

$a = '10000000000000000000033';
$b = '500000000098';

echo "Складываем $a и $b <br>" . 'Результат = ' . bigSum($a, $b);
Evgeniy

Оффтоп :)
Библиотека для сложения двух чисел с использованием ООП:
https://habr.com/post/172119/
:)

Популярное за сутки
Сейчас читают
Логические задачи с собеседований