使用增量嵌套for循环求解方程

时间:2015-07-12 19:45:26

标签: java for-loop

我正在尝试使用嵌套的forloops求解方程式。

我试图在等式(-25)i +(14)j +( - 8)k = -77中求解(i,j,k)。规范是-77。

我一直在尝试调试它,但无法找到我的算法的问题。

这是我的代码:

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

2 个答案:

答案 0 :(得分:2)

您的方法总体上是错综复杂的。您尝试获取ijk的值。所以保持简单!

首先,您需要测试每个可能的组合,因此三重嵌套for循环是有意义的。然后,您将需要运行计算并测试输出。如果输出为-77,则您已为ijk找到一个解决方案。因此,将其分解为我们已经达到的阶段。

  • 测试ijk
  • 的每个值
  • ijk插入公式。
  • 如果公式的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

您可以覆盖toString对象中的Solution方法以打印出合理的输出。

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 :(得分: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));
    }
    [...]
}

您忘记将i添加到newX,它应该是f[0] * (newx + i)。这适用于if条件以及println(...)。如果你纠正了这些错误,你就找到了解决方案。

摆脱无限循环:

  • 删除while循环
  • && test添加到每个for循环条件
  • 在每个test = false; - 正文
  • 中添加if

(这个解决方案既快又脏,但我会让你弄明白,如何以更合适的方式解决它。)

要获得更优雅的整体解决方案,请查看christoper's answer。在那里,您可以找到(从软件工程师的角度来看)清洁解决方案,以及您可能想要的一些扩展。