项目欧拉454

时间:2014-01-13 10:09:27

标签: php

我试图理解这个问题的核心,但我似乎错过了一些简单的事情。

enter image description here

我制作了这样的测试脚本,以了解数字是如何真正生成的:

$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 );

2 个答案:

答案 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 );