gpt4 book ai didi

php - 在对整数数组进行数学运算时如何翻转?

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:17:32 24 4
gpt4 key购买 nike

因此,我尝试对整数数组进行数学运算,同时在数组的每一部分中强制执行最大整数。类似这样:

function add($amount) {
$result = array_reverse([0, 0, 0, 100, 0]);
$max = 100;

for ($i = 0; $i < count($result); ++$i) {
$int = $result[$i];
$new = $int + $amount;
$amount = 0;

while ($new > $max) {
$new = $new - $max;
++$amount;
}

$result[$i] = $new;
}

return array_reverse($result);
}

add(1); // [0, 0, 0, 100, 1]
add(100); // [0, 0, 0, 100, 100]
add(101); // [0, 0, 1, 0, 100]

所以我上面的方法有效,但在添加更大的整数时速度很慢。我试图通过按位移位来做到这一点并接近但由于某种原因我无法让它工作。我想我需要第三方的视角。有人有什么建议吗?

最佳答案

占用大部分时间的部分是 while 循环。您将反复降低该值,直到您的值低于 100。但是,使用 PHP 像这样向下循环需要花费大量时间(在我的本地计算机上输入一个 12 位整数需要 20 多秒)。相反,使用乘法和除法(以及 if)。它的速度要快得多。使用此代码完成相同的 12 位整数花费了不到一秒的时间:

function add($amount) {
$result = array_reverse([0, 0, 0, 100, 0]);
$max = 100;

for ($i = 0, $size = count($result); $i < $size; ++$i) {
$int = $result[$i];
$new = $int + $amount;
$amount = 0;

if( $new > $max ) {
$remainder = $new % $max;
// Amount is new divided by max (subtract 1 if remainder is 0 [see next if])
$amount = ((int) ($new / $max));
// If remainder exists, new is the the number of times max goes into new
// minus the value of max. Otherwise it is the remainder
if( $remainder == 0 ) {
$amount -= 1;
$new = $new - ((($new / $max) * $max) - $max);
} else {
$new = $remainder;
}
}

$result[$i] = $new;
}

return array_reverse($result);
}

另请注意,我将您的 count($result) 调用移到了 for 循环的变量初始化部分。当它位于表达式部分时,它会在每次 for 循环重复时执行,这也会增加执行函数的总时间。

另请注意,对于像这样的大型数学更改,您可能需要断言您期望计算的值范围以确保没有异常值。我做了一个小范围,结果都一样,但我鼓励你自己跑。

关于php - 在对整数数组进行数学运算时如何翻转?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39084829/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com