Как получить результат в виде целого числа?

Ввод будет состоять из множества пар цифр, каждая из которых находится на отдельной строке, а цифры разделены запятой. Числа могут быть длиной до 100 цифр. Числа будут целыми, а дробные числа и отрицательные числа не будут вводиться. Ввод будет прекращен в конце файла.

Выходными данными будут обратные суммы, каждая на отдельной строке. Для каждой входной пары должна быть одна обратная сумма.

Я пишу этот код, но не выдает правильный результат как целочисленное значение

$number="36222813552166588601325554186418874001226412488844274840066661514,32814873748120642422248240335447
";
$int_array = array_map("intval", explode(",", $number));

$sum=0;
foreach($int_array as $item)
{
$sum=$sum+strrev($item);
}
$reverse_sum=str_replace("0","",strrev($sum));
echo $reverse_sum;

Получил вывод: 91+E562719451714.1

Ожидаемый результат: 68046696201386131133563894412955974001226412488844274840066661514

-1

Решение

Все числа в PHP ограничены системным размером WORD, то есть 32 бита (PHP_INT_MAX = 2147483647) или 64 бита (PHP_INT_MAX = 9223372036854775807). Любые числа, оцененные как превышающие этот предел, будут преобразованы в десятичную с плавающей запятой.

Подумайте об использовании BCMath, который хранит числа в десятичной (удобочитаемой) форме, а не в двоичной форме, в виде строк, чтобы они могли быть практически бесконечно длинными:

$input = "36222813552166588601325554186418874001226412488844274840066661514,32814873748120642422248240335447";
$numbers = explode(",", $input);
$sum = "0";
foreach($numbers as $num){
$sum = bcadd($sum, $num);
}

$reversed = str_replace("0", "", strrev($sum));
echo $reversed;

Выход: 169699638879668496611618698146814555231688566125531822263

Я понятия не имею, как вы получите ожидаемый результат в соответствии с кодом, который вы предоставили. Я также не понимаю, почему вы удаляете нули. (Может быть, вы хотите использовать ltrim(strrev($sum), "0") вместо? Результатом будет 16969960388079668490606100161860981468145552310688566125531822263, который вы тоже не ищете.

Если у вас есть десятичные числа, попробуйте добавить четвертый параметр в ваш ввод.

2

Другие решения

Вы можете использовать BCMath или GMP. Либо вам потребуется установить необходимые расширения. Например, делая это с GMP:

$number="36222813552166588601325554186418874001226412488844274840066661514,32814873748120642422248240335447";
$int_array = explode(",", $number);

$sum = 0;
$gmp_sum = gmp_init('0');

foreach($int_array as $item)
{
$gmp_sum = gmp_add($gmp_sum, strrev($item));
$sum     = $sum+strrev($item);
}
$original_reverse_sum = str_replace("0","",strrev($sum));
$gmp_reverse          = str_replace("0", "", strrev(gmp_strval($gmp_sum)));

echo "Original Reverse Sum: $original_reverse_sum \n";
echo "GMP result: $gmp_reverse\n";

Выход:

Оригинальная обратная сумма: 46 + E74846666151.4

Результат GMP: 68466962138613113356389441295597412264124888442748466661514

Я думаю, что вы делаете, это какое-то упражнение, потому что я понятия не имею, почему вы хотите такой вывод, но это должно сработать.

0

По вопросам рекламы [email protected]