【问题标题】:Optimize the function of searching for an integers which squared summ of dividers will be an integer优化查找除数平方和为整数的整数功能
【发布时间】:2021-01-01 18:52:30
【问题描述】:

我有这个功能:

function listSquared($m, $n)
{
    $result = [];
    $integers = range($m, $n);
    foreach($integers as $number){
        $divisors = [];
        $int_of_num = range(1, $number);
        foreach($int_of_num as $number2){
            if ($number % $number2 === 0) {
                $divisors[] = $number2;
            }
        }
        $result[] = $divisors;
    }
    $all_div = array_combine($integers, $result);
    $result_sum = [];
    foreach($all_div as $key => $value){
        $sum = 0;
        foreach($value as $num){
            $sum += $num ** 2;
        }
        $sqrt = sqrt($sum);
        if($sqrt == (int)$sqrt){
            $result_sum[] = [$key, $sum];
        }

    }

    return $result_sum;
}

运行良好,但执行需要花费大量时间。任何想法如何优化这段代码?(使用记忆)

输出示例:

listSquared(1, 250)

Array ( [0] => Array ( [0] => 1 [1] => 1 ) [1] => Array ( [0] => 42 [1] => 2500 ) [2] => Array ( [0] => 246 [1] => 84100 ) )

附:这个函数搜索一个整数,除数的平方和将是一个整数。

【问题讨论】:

  • 你能给出一个预期输出的示例代码执行吗?
  • 请详细说明问题陈述。不清楚你在做什么。
  • 如何优化?速度?内存使用情况?可读性?
  • @Mast 我认为我需要优化内存使用。

标签: php loops optimization


【解决方案1】:

您可以加快过滤不能作为除数的数字,而不是尝试它们。如果一个数是奇数,除数就不可能是偶数。正方形也一样。 这将使您的尝试次数减少 50%。

【讨论】:

  • 嗯...关闭一个。只是需要尝试。
  • 数字的除数不仅可以是奇数...错误的方式。而过滤器只是增加了更多的执行时间。 $integers = array_filter($integers, function($num){ return !($num & 1); });
  • range (mixed $start , mixed $end [, number $step = 1 ] ) : 数组你不需要使用过滤器,只是不要将它添加到范围... step = 2 甚至开始2奇开始1
【解决方案2】:

我找到了解决方案。如果您想优化您的代码,只需尝试将您的代码划分为函数以减少执行时间。

function listSquared($m, $n)
{
    
    $result = [];
    for ($i = $m; $i <= $n; $i++) {
        $sum = sumDivisorsSq($i);

        if (isSquare($sum)) {
            $result[] = [$i, $sum];
        }
    }
    

    return $result;
}

function isSquare($num){
    $s = sqrt($num);
    return $s == (int)$s;
}

function sumDivisorsSq($number){
    $sum = 0;

    for($i = 1; $i <= round(sqrt($number)); $i++){
        if($number % $i == 0){
            $sum += $i ** 2;
            $j = $number / $i;
            if ($i !== $j) {
                $sum += $j ** 2;
            }
        }
    }

    return $sum;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-24
    • 2019-04-24
    • 2015-03-04
    • 1970-01-01
    • 2016-04-25
    • 2020-09-06
    • 1970-01-01
    相关资源
    最近更新 更多