Php Euler#23项目:非充裕金额

Php Euler#23项目:非充裕金额,php,algorithm,Php,Algorithm,我正在与欧拉计划斗争 我有一个脚本,可以计算大量的数字: function getSummOfDivisors( $number ) { $divisors = array (); for( $i = 1; $i < $number; $i ++ ) { if ( $number % $i == 0 ) { $divisors[] = $i; } } return array_sum( $diviso

我正在与欧拉计划斗争

我有一个脚本,可以计算大量的数字:

function getSummOfDivisors( $number )
{
    $divisors = array ();
    for( $i = 1; $i < $number; $i ++ ) {
        if ( $number % $i == 0 ) {
            $divisors[] = $i;
        }
    }
    return array_sum( $divisors );
}

$limit = 28123;
//$limit  = 1000;
$matches = array();
$k = 0;

while( $k <= ( $limit/2 ) ) {
    if ( $k < getSummOfDivisors( $k ) ) {
        $matches[] = $k;
    }
    $k++;
}

echo '<pre>'; print_r( $matches );
现在,它应该存储所有不能被创建为大量数字之和的数据,但这里并没有什么东西。当我把它们加起来的时候,我得到了一个甚至不接近正确答案的数字

我不想看到答案,但我需要一些关于我做错了什么(或者我遗漏了什么或没有理解什么)的指南/提示


编辑:我也尝试了相反的顺序,意思是,从顶部开始,除以2,然后检查这些是否足够。仍然是错误的。

您的逻辑中有一个错误:

“我可以把它们乘以2,得到两个充裕数之和的数”

首先确定低于分析证明极限的所有富足数[n1,n2,n3…]。然后,所有整数[2*n1,2*n2,…]都是两个富足数之和,但n1+n2和n2+n3也是两个富足数之和,这是正确的。这就是你的错误。你必须计算所有可能的整数,它们是[n1,n2,n3…]中任意两个数字的总和,然后求逆,找到不可能的整数

我已经用互联网上的数据核对了这些数字,它们是正确的。我可以把它们乘以2,得到两个丰富数之和的数


不,那不对。下面只有一个丰富的数字是php代码需要320秒


“现在应该存储所有,不能创建为富足数之和”这只是存储所有富足数,这是一个中间步骤,但不是终点。我有一个线索,你思路中的错误是“我可以将它们乘以2,得到两个富足数之和的数字”。这里假设两个富足数之和必须是两个相同的富足数之和。也就是说,如果充裕数是n,那么和就是2n。但对于两个丰富的数字n和m,n+m之和也成立,这难道不是吗?我还没有严格地证实这一点,但正如你所要求的那样tips@Pankrates我添加了问题的完整描述,但您的想法可能是正确的。将检查;)请不要发布完整的解决方案。你拿走了改变,让其他人自己解决。
if ( $k >= getSummOfDivisors( $k ) )
 <?php

set_time_limit(0);
ini_set('memory_limit', '2G');
$time_start = microtime(true);

$abundantNumbers = array();
$sumOfTwoAbundantNumbers = array();
$totalNumbers = array();
$limit = 28123;

for ($i = 12; $i <= $limit; $i++) {
    if ($i >= 24) {
        $totalNumbers[] = $i;
    }
    if (isAbundant($i)) {
        $abundantNumbers[] = $i;
    }
}


$countOfAbundantNumbers = count($abundantNumbers);
for ($j = 0; $j < $countOfAbundantNumbers; $j++) {
    if (($j * 2) > $limit)
        break;                    //if sum of two abundant exceeds limit ignore that
    for ($k = $j; $k < $countOfAbundantNumbers; $k++) {  //set $k = $j to avoid duble addtion like 1+2, 2+1
        $l = $abundantNumbers[$j] + $abundantNumbers[$k];
        $sumOfTwoAbundantNumbers[] = $l;
    }
}
$numbers = array_diff($totalNumbers, $sumOfTwoAbundantNumbers);

echo '<pre>';print_r(array_sum($numbers));

$time_end = microtime(true);
$execution_time = ($time_end - $time_start);

//execution time of the script
echo '<br /><b>Total Execution Time:</b> ' . $execution_time . 'seconds';
exit;

function isAbundant($n) {
    if ($n % 12 == 0 || $n % 945 == 0) { //first even and odd abundant number. a multiple of abundant number is also abundant
        return true;
    }
    $k = round(sqrt($n));
    $sum = 1;
    if ($n >= 1 && $n <= 28123) {
        for ($i = 2; $i <= $k; $i++) {
            if ($n % $i == 0)
                $sum+= $i + ( $n / $i);
            if ($n / $i == $i) {
                $sum = $sum - $i;
            }
        }
    }
    return $sum > $n;
}