1

Project Euler Problem 9を解決しようとしています:

ピタゴラスの 3 連符は、a < b < c の 3 つの自然数のセットであり、a2 + b2 = c2

たとえば、32 + 42 = 9 + 16 = 25 = 52 です。

a + b + c = 1000 であるピタゴラスの 3 連符が 1 つだけ存在します。積 abc を見つけます。

ウィキペディアでピタゴラスの三重項を見つける式を探し、それをコードに翻訳しようとしました。問題は、コードが間違った答えを出力していることですが、コードは正しいと思います。

var a, b, c;
var pos1, pos2, pos3;
var ans1, ans2, ans3;

for(var n=2; n<=20000; n++) {
  a = 2 * n + 1;
  b = 2 * n * (n +1);
  c = 2 * n * (n +1) + 1;
  if(a<b<c) {
  if(a^2 + b^2 === c^2) {
      pos1 = a;
      pos2 = b;
      pos3 = c;
  }
  if(a + b + c ===1000) {
      ans1 = a;
      ans2 = b;
      ans3 = c;
  }
}
}
console.log(ans1 + " " + ans2 + " " + ans3);
4

5 に答える 5

8

これは解決策です

var a;
var c;

for (var b = 1; b < 1000; b += 1) {
    a = (500000 - 1000 * b) / (1000 - b);

    if (Math.floor(a) === a) {
        c = 1000 - a - b;

        break;
    }
}

console.log(a, b, c);

結果は 375 200 425

jsfiddle

ピタゴラス
a 2 + b 2 = c 2

また
、a + b + c = 1000

代数があり、c を左に並べ替えます
c = 1000 - (a + b)

c をピタゴラス
a 2 + b 2 = (1000 - (a + b)) 2

乗算
a 2 + b 2 = 1000000 - 2000 * (a + b) + (a + b) 2

乗算
a 2 + b 2 = 1000000 - 2000 * (a + b) + a 2 + 2 * a * b + b 2 a 2 + b 2を単純化するために

並べ替えます
0 = 1000000 - 2000 * (a + b) + 2 * a * b

未知数を左に並べ替える
2000 * (a + b) - 2 * a * b = 1000000

単純化 / 2
1000 * (a + b) - a * b = 500000

factorsize
a(1000 - b) + 1000 * b = 500000

並べ替え
a(1000 - b) = 500000 - 1000 * b

a = (500000 - 1000 * b) / (1000 - b)

ここで、b を入力し、a を計算して、a がピタゴラス トリプルで必要とされる整数かどうかをテストします。

于 2013-04-22T09:35:59.383 に答える
5

TGarr、Xotic750の回答の説明は次のとおりです。

アルゴリズムをどのように作成したのか、よくわかりません。なぜ a = to (500000 - 1000 * b) / (1000 - b) ...

彼は a^2 + b^2 = c^2 と a + b + c = 1000 から始めて、それらを組み合わせました。これは、projecteuler の問題で、これらのステートメントの両方が真になる数のセットは 1 つだけであると述べられているためです。これが彼がそれらをどのように組み合わせたかです。彼は、c の 2 番目の方程式を c = 1000 - (a + b) になるように解きました。次に、それを最初の式に代入して、a^2 + b^2 = (1000 - (a + b))^2 にしました。彼は、a の方程式全体を解くことができるまで続けました。それができるようになると、b を増加させる単一のループを作成することができましたfor。これは、他の多くのオプションよりもはるかに単純でエレガントです。

if ステートメントの条件が Math.floor(a) === a に設定されているのはなぜですか?

これは単に「 はa、最も近い整数に切り捨てられ、a?と同じ」という意味です。つまり、a整数ですか?console.log ( a );(彼のコードをコピーし、ステートメントの上に追加しifます。それは、そのコードのビットを理解するのに役立つかもしれません) 彼は a の方程式を解くことができたので、彼がしなければならなかったことは、b に異なる数を代入することだけでした。結果が整数だった場合、彼は答えを持っているでしょう。または、少なくとも彼は何を知っていて、c が何であるかを彼ab c = 1000 - a - b;伝え、それが彼女が書いたすべてです。

于 2013-07-06T04:23:01.207 に答える