0

输入将由许多数字对组成,每个数字对位于单独的行中,数字用逗号分隔。这些数字可以长达 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

4

1 回答 1

2

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,这也不是您要寻找的。

如果您有十进制数,请考虑将第四个参数添加到您的输入中。

于 2017-01-02T14:29:22.063 回答