2017-07-26 14 views
0

私は自分でMATLABに取り組んでいます、そしてプロジェクトオイラー 上の問題9をやっていたことがMATLAB単純計算

を述べて「ピタゴラスのトリプレットは、3つの自然数の集合、< B < C、のためであります、

例えば

A2 + B2 = C2 、32 + 42 = 9 + 16 = 25 = 52

存在するA + B + C = 1000 が製品を検索対象の正確に一つのピタゴラスのトリプレットabc。 "

以下は私が書いたコードです。しかし、それはコンパイルされますが、生成して出力しません。私は何が間違っているかについてのフィードバックを得ることを望んでいたので、修正することができます。

おかげで、

syms a; 
syms b; 
syms c; 
d= 1000; 
d= a + b + c ; 
ab= a.^2 + b.^2; 
ab= c.^2; 
c 
+2

*検索*を実行することになっています。また、あなたのコードには自然数の概念はありません。 –

+1

可能なすべての整数をループし、それらが機能するかどうかを確認する必要があります。象徴的な数学パッケージはあなたが望むことをしません。 – rlbond

+0

もっとMatlabのようなやり方(ループの代わりにベクトル化)で行いたい場合は、 'ndgrid'を使って' 1:1000'を行と列に沿って繰り返します。あるいは、 'bsxfun' /暗黙的なシングルトン拡張を使うのが良いでしょう。 'hypot'は便利かもしれません –

答えて

3

は、私は問題を解決するために(つまり、ループを使用せずに、である)ベクトル化の方法を提案します。それは比較的複雑に思えるかもしれません。特に、あなたが他のプログラミング言語から来ている場合、 Matlabの場合は、このような問題に慣れる必要があります。

成分:

熟知していない場合は、これらの概念を読んでから、問題を自分で解決してください(当然、プロジェクトオイラー全体のポイントです)。ヒントとして、これらの線に沿って進行する以下のコード:

  1. ab可能なすべての値を含む1×1000年ベクトルを生成します。
  2. 計算各対aに対応cの値が1000×1000年マトリックス、b
  3. その計算から新しい行列の各エントリはa+b+c
  4. そのマトリックスは1000に等しく、行と列のインデックスを探す含むよう。これらのインデックスは、希望するabです(なぜ?)。
  5. 複数のソリューションが表示されます(なぜですか?)。一つを選ぶ。
  6. 得られたabと対応するcの積を計算します。

自分自身を試したら、あなたはコード(それの上にマウスを移動)をチェックすることもできます。

ab = 1:1000; % step 1
cc = hypot(ab,ab.'); % step 2
sum_abc = ab+ab.'+cc; % step 3
[a, b] = find(sum_abc==1000); % step 4
a = a(1); b = b(1); % step 5
prod_abc = a*b*cc(a,b); % step 6