0

我的作业要求执行以下操作:
Search2:搜索 x*x + y*y - 12x -10y + 36 = 0 的解决方案。在 x 和 y 中搜索从 0 到 10,搜索每个 y 值,然后再移动到下一个 x。打印找到的前三个解决方案。(注意 - 标记中断在这里很方便!)

我无法弄清楚这其中的逻辑。我想我必须使用超过 2 个循环,但不确定。
这就是我到目前为止所拥有的(它只是重复(6,0)):

for (int j = 0; j <= 10; j++) {
    for (int i = 0; i <= 10; i++) {
        while (((i * i) + (j * j) - (12 * i) - (10 * j) + 36) == 0) {
            System.out.println("(" + i + ", " + j + ")");  
        }  
    }  
}  

更新
这是解决方案:

    int t = 0;

    for (int i = 0; i <= 10; i++) {
        if (t == 3) {
            break;
        }
        for (int j = 0; j <= 10; j++) {
            if (((i * i) + (j * j) - (12 * i) - (10 * j) + 36) == 0) {
                System.out.println("(" + i + ", " + j + ")");
                t++;
            }
        }
    }
4

7 回答 7

2

不错的尝试。因为你是如此接近,我会告诉你一个可行的解决方案。基本上,你需要做三件事:

  1. 更改whileif
  2. 使用一个变量来计算你找到解决方案的次数,这样你就可以停在三
  3. 添加标签,以便您可以从内循环中跳出外循环

我还建议您使用与问题相同的变量名称 - 即xy- 为了清楚起见。

int count = 0;
outerLoop:
for (int y = 0; y <= 10; y++) {
    for (int x = 0; x <= 10; x++) {
        if (x * x + y * y - 12 * x - 10 * y + 36 == 0) {
            System.out.println("(" + x + ", " + y + ")");  
            if (++count == 3)
                break outerLoop;
        }
    }
}

执行时,此代码产生:

(6, 0)
(3, 1)
(9, 1)

很抱歉喂你,但这里的部分课程是良好的编码风格和实践。

于 2012-01-11T20:56:02.667 回答
0

您正在使用一个无限运行的额外while循环。

while (((i * i) + (j * j) - (12 * i) - (10 * j) + 36) == 0) {
    System.out.println("(" + i + ", " + j + ")");  
}

这第一次评估为真 - 即当它达到 (6,0) - 它将继续运行,因为i并且j没有在内部修改。

您需要将其替换为if.

于 2012-01-11T20:47:36.527 回答
0

好好看看你拥有的内部 while 循环。一旦找到方程的解,i并且j永远不会改变,并且公式总是计算为0,从而导致无限循环。

i为了清楚起见,将and重命名j为 x 和 y也可能是明智的。不过,您大部分时间都在正确的轨道上。不要忘记您只需要打印前三个解决方案。

于 2012-01-11T20:49:25.713 回答
0

因为这是一个非常简单的概念,所以我不会对您有太多帮助,但是请考虑一下您需要循环的内容,这可能会使使用 x 和 y 代替 i 或 j 更容易。此外,您只打印 (6,0),因为这正是您告诉它使用 while 循环执行的操作。

一个提示,您的 while 循环应该有一个停止其功能的语句,假设 x < 4,如果它大于或 = to,它将在循环外继续。

于 2012-01-11T20:50:22.483 回答
0
public class EquationSolver {

    public static void main(String[] args) {

        int found = 0;
        searchSolutions:
        for (int y = 0; y <= 10; y++) {
            for (int x = 0; x <= 10; x++) {
                if (((x * x) + (y * y) - (12 * x) - (10 * y) + 36) == 0) {
                    System.out.println("(" + x + ", " + y + ")");
                    found ++;
                    if (found == 3) {
                        break searchSolutions;
                    }
                }
            }

        }

    }

}
于 2012-01-11T20:59:22.110 回答
0

很长时间以来,我上次写了一些这样的作业……只是为了好玩:)

public class Main {

    public static void main(String[] args) {
        int[] range = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
        boolean isSolutionFound = Boolean.FALSE;
        int solCounter = 0;

        searchSolutions:
        for (Integer y : range) {
            for (Integer x : range) {
                isSolutionFound = checkForSolution(x, y);
                if (isSolutionFound) {
                    printSolution(x, y);
                    solCounter++;
                }

                if (solCounter == 3) 
                    break searchSolutions;
            }
        }
    }

    private static void printSolution(Integer x, Integer y) {
        System.out.println(x + "," + y); // use some fancy formatting instead
    }

    private static boolean checkForSolution(int x, int y) {
        if (x * x + y * y - 12 * x - 10 * y + 36 == 0)
            return true;
        else
            return false;
    }

}
于 2012-01-11T21:03:25.977 回答
-2
for (int j = 0; j <= 10; j++)
{
   for (int i = 0; i <= 10; i++)
   {
      if (((i * i) + (j * j) - (12 * i) - (10 * j) + 36) == 0)
      {
         System.out.println("(" + i + ", " + j + ")");
         return;
      }  
   }  
} 

记住该return;部分很重要,否则尽管您已经找到了解决方案,但您仍会寻找解决方案。如果您不想要更多的解决方案,那么您应该省略“return”语句。

于 2012-01-11T20:50:24.623 回答