我试图理解这个问题的核心,但我似乎错过了一些简单的事情。
我制作了这样的测试脚本,以了解数字是如何真正生成的:
$limit = 15;
$result = array();
$count = 0;
for ( $x=1; $x<$limit; $x++ ) {
for ( $y=1; $y<=$limit; $y++ ) {
for ( $n=1; $n<=$limit; $n++ ) {
if ( ( ( 1/$x + 1/$y ) == 1/$n ) && ( $x < $y ) )
$count ++;
$result[$count]['x'] = $x;
$result[$count]['y'] = $y;
$result[$count]['n'] = $n;
}
}
}
echo count( $result );
对于F(15)我得到4,但是对于F(1000)我只得到877(而不是问题本身中提到的1069)。
我的剧本逻辑中的错误在哪里?
编辑:工作脚本
$count = 0;
$result = array();
for ( $x=2; $x<$limit; $x++ ) {
for ( $y=2; $y<=$limit; $y++ ) {
$n = ($x*$y)/($x+$y);
if ( is_int( $n ) && ( $x<$y ) ) {
$count++;
$result[$count]['x'] = $x;
$result[$count]['y'] = $y;
$result[$count]['n'] = $n;
}
}
}
echo count( $result );
答案 0 :(得分:1)
您的错误是$n
不应低于$limit
,这是您代码中的情况:)。
我不会将n
放入循环中。我宁愿把它设置为n = x*y/(x+y)
,这是实际的情况!
$limit = 15;
$result = array();
$count = 0;
for ( $x=1; $x<$limit; $x++ ) {
for ( $y=1; $y<=$limit; $y++ ) {
$n = ($x*$y)/($x+$y);
$condition = ($x*$y)%($x+$y);
if ( ( $condition == 0 && ( $x < $y ) && ( $y <= $limit ) )
$count ++;
$result[$count]['x'] = $x;
$result[$count]['y'] = $y;
$result[$count]['n'] = $n;
}
}
echo count( $result );
答案 1 :(得分:0)
我建议稍微简化你的循环。由于x<y
没有理由一直运行x-loop来限制。以下内容应该更快,尽管它仍然是O(n^2)
因此仍然需要很多年才能获得L=10^12
的解决方案
$limit = 15;
$result = array();
$count = 0;
for ( $y=2; $y<=$limit; $y++ ) {
for ( $x=1; $x<$y; $x++ ) {
$n = ($x*$y)/($x+$y);
if ( is_int( $n ) ) {
$count++;
$result[$count]['x'] = $x;
$result[$count]['y'] = $y;
$result[$count]['n'] = $n;
}
}
}
echo count( $result );