Ввод будет состоять из множества пар цифр, каждая из которых находится на отдельной строке, а цифры разделены запятой. Числа могут быть длиной до 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
Все числа в 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, который вы тоже не ищете.
Если у вас есть десятичные числа, попробуйте добавить четвертый параметр в ваш ввод.
Вы можете использовать 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
Я думаю, что вы делаете, это какое-то упражнение, потому что я понятия не имею, почему вы хотите такой вывод, но это должно сработать.