php - 欧拉计划 #23 : Non-abundant sums

标签 php algorithm

我正在为 Euler 项目而苦苦挣扎 problem 23: Non-abundant sums .

enter image description here

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

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,得到两个丰富数字之和的数字。

但是因为我需要找到所有不能这样写的数字,所以我只是像这样反转 if 语句:

if ( $k >= getSummOfDivisors( $k ) )

这现在应该存储所有不能创建为大量数字总和的内容,但这里并没有停止。当我对它们求和时,我得到一个与正确答案相去甚远的数字。

我不想看到答案,但我需要一些指导方针/提示来说明我做错了什么(或者我遗漏或误解了什么)。

编辑:我还尝试了相反的顺序,也就是说,从顶部开始,除以 2 并检查它们是否充足。还是出错了。

最佳答案

你的逻辑错误在于:

“我可以将它们乘以 2,得到两个大量数字之和的数字”

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

关于php - 欧拉计划 #23 : Non-abundant sums,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14321619/

相关文章:

c++ - 100% 确定性的快速素数测试?

php - Valums jquery uploader 可以工作但返回 "Failed"

php - 如何使倒数计时器在页面刷新时不重置

php - 在 Laravel 中获取每个用户的最新消息(行)

c++ - 分而治之以找到数组中的最大差异

python - 在列表中查找元素索引的最快方法

php - 将报告打印到纸上

PHP编辑表A,显示到文本框然后保存到表B

algorithm - 大 O 表示法 - 增长率

algorithm - 为什么我们应该使用n路合并?它比 2-way merge 有什么优势?