2017-07-26 214 views
0

我的工作在MATLAB我自己,並在項目歐拉在做題9 它指出MATLAB簡單計算

「A勾股數是一組三個自然數a < b < C,對於其中,

A2 + B2 = C2 例如,32 + 42 = 9 + 16 = 25 = 52

存在着正好一個勾股數爲其中+ 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' /隱式單例擴展。 「低壓」可能會得心應手 –

回答

3

我提出了一個量化的方式(即,不使用循環)來解決這個問題。這看起來可能相對複雜,特別是如果你來自其他編程語言;但對於Matlab來說,你應該習慣這種接近問題的方式。

成份:

如果您不熟悉這些概念,然後嘗試自己解決問題(這當然是Project Euler的全部觀點),請閱讀這些概念。作爲提示,下面的代碼沿着這些路線前進:

  1. 生成包含ab所有可能值的1×1000載體中。
  2. 計算一個1000×1000矩陣的c對應於每對a值,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