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;
}