输入将由许多数字对组成,每个数字对在一个单独的行上,数字用逗号分隔。数字可以长达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
答案 0 :(得分: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,这不是你想要的。
如果您有十进制数字,请考虑在输入中添加第四个参数。
答案 1 :(得分:0)
您可以使用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
我猜你正在做的是某种练习,因为我不清楚为什么你想要这种输出,但这应该有效。