2015-07-12 32 views
0

我正在嘗試使用嵌套forloops求解方程。我試圖在方程(-25)i +(14)j +(-8)k = -77中求解(i,j,k)。標準是-77。使用增量嵌套for循環求解方程

我一直在試圖調試它,但無法找到我的算法的問題。

這裏是我的代碼:

int newx = -20; int newy = -20; int newz = -20; 
test = true; 
while(test){ 
    for(int i = 0; i < 20; i++){ 
     if((f[0]*(newx+i) + f[1]*newy + f[2]*newz) == norm){ 
      System.out.println(f[0]*(newx+i) + f[1]*newy + f[2]*newz); 
     } else { 
      for(int j = 0; j < 20; j++){ 
       if((f[0]*(newx) + f[1]*(newy+j) + f[2]*newz) == norm){ 
        System.out.println((f[0]*(newx) + f[1]*newy+j + f[2]*newz)); 
       } else { 
        for(int k = 0; k < 20; k++){ 
         if((f[0]*(newx) + f[1]*(newy) + f[2]*(newz+k)) == norm){ 
          System.out.println((f[0]*(newx) + f[1]*newy + f[2]*newz+k)); 
         } 
        } 
       } 
      } 
     } 
    } 
} 
+0

究竟是什麼問題?你會得到什麼輸出?你能指望什麼? 「解決方程」是什麼意思?你只是想在預先設定的網格點上評估方程嗎?對我而言,目前還不清楚,你在問什麼。 – Turing85

+0

什麼是「標準」? 「test = false」或「break」或終止「while」循環的地方在哪裏? –

+0

@ rakeb.void我試着測試= false,但循環沒有終止,所以我刪除它。 – th3r1singking

回答

2

您的方法一般都很複雜。您正試圖獲得i,jk的值。所以保持簡單!

首先,您將需要測試每種可能的組合,因此三重嵌套for循環是有意義的。然後,您將需要運行計算並測試輸出。如果輸出爲-77,則發現一個解決方案爲i,jk。所以把它分解成我們擁有的階段。

  • 測試每個值爲i,jk
  • 插入i,jk代入公式。
  • 如果output的公式爲-77,則打印結果。

所以現在我們知道階段,讓我們把它變成一些代碼。

for(int i = 0; i < 20; i++) { 
    for(int j = 0; j < 20; j++) { 
    for(int k = 0; k < 20; k++) { 
     // Go through each value. 
     int output = (-25 * i) + (14 * j) + (-8 * k); 
     // Plug the values into the formula. 
     if(output == -77) { 
      // Test and output. 
      System.out.println("i = " + i + ", j = " + j + ", k = " + k); 
     } 
    } 
    } 
} 

現在,你不知道你有多少解決方案會到這裏,所以我會創建一個名爲Solution另一個類。

public class Solution { 
    private int i; 
    private int j; 
    private int k; 

    // Appropriate constuctor and getters. 
} 

這樣,當你需要保存它時,你可以說。

List<Solution> mySolutions = new ArrayList<Solution>(); 

// Nested for loops. 

mySolutions.add(new Solution(i, j, k)); // Provided that you wrote the constructor 

而且你可以覆蓋Solution對象打印出一個合理的輸出toString方法..

public String toString() { 
    return "i =" + i + ", j =" + j + ", k =" + k; 
} 

所以,當你的輸出,它看起來像..

i = 1, j = 2, k = 10 
i = 1, j = 6, k = 17 
i = 3, j = 1, k = 2 

檢出...

  • 我在IDEOne中做了一個簡單的版本,以幫助您入門。
1

您錯誤地評估內部if條件,例如:

for(int j = 0; j < 20; j++){ 
    if((f[0]*(newx) + f[1]*(newy+j) + f[2]*newz) == norm){ 
     System.out.println((f[0]*(newx) + f[1]*newy+j + f[2]*newz)); 
    } 
    [...] 
} 

你忘了添加inewX,它應該是f[0] * (newx + i)。這適用於if條件以及println(...)。如果你糾正了這些錯誤,你會找到一個解決方案。

爲了擺脫無休止的循環中:

  • 刪除while
  • 添加&& test每個for循環條件
  • 在每個if體區

添加test = false;(這種解決方案既快又骯髒,但我會讓你弄清楚,如何以更合適的方式解決它)。

如需更優雅的整體解決方案,請查看christoper's answer。在那裏你可以找到一個(從軟件工程師的角度來看)更乾淨的解決方案,以及一些你可能想要的擴展。