查找特定正整数

我想找到整数n,这样当1 / z + 1 / x = 1 / n时就有1000种组合。 这是我的代码:

int counter = 0; double n = 1; while (true) { for (double i = 1; i < 10000; i++) { for (double t = 1; t < 10000; t++) { if ((1/i) + (1/t) == (1/n)) { counter++; System.out.println(counter); } } } if (counter < 1000) { counter = 0; n++; } else { System.out.println("Counterr: " + counter); System.out.println("Answer: " + n); System.exit(0); } } 

如果我试图找到4种组合,它会起作用,但不会在1000时发生。为什么?

这可能是因为浮点精度问题。 您在循环中对double使用increment ++运算符,并将双精度数与==进行比较。 这些操作的结果可能不如预期,特别是在多次迭代之后。

尝试更改代码以使用精确精度的整数,而不是双精度。 请注意你的等式

1 / z + 1 / x = 1 / n

相当于

n *(x + z)= x * z

所以,按如下方式更改循环:

  for (int i = 1; i < 10000; i++) { for (int t = 1; t < 10000; t++) { if (n * (i + t) == i * t) { counter++; System.out.println(counter); } } } 

此外,现在更清楚如何优化迭代范围。 考虑it下限和上限 - 减少迭代范围将显着提高整体性能。

不幸的是,我目前没有测试过结果,但我很确定你应该用整数计算,而不是用双精度计算。

您没有提供在Netbeans中弹出的错误代码。 但我假设有一个outofbounds错误。 或exception错误。 它找不到1000,因为你的while循环是无限的。 当“组合”达到1000时,您必须能够停止循环

尝试在内部循环中使用大于10000数字来增加搜索空间。 也许9999999

我相信你不太可能找到1000个1/z + 1/x = 1/n用于{z,x,n} in [1...10000]的相同n

编辑。

 int counter = 0; double n = 1; double maxiter = 1000*1000; double i,t; while (true) { for (i = 1; i < 10000; i++) { for (t = 1; t < 10000; t++) { if ((1/i) + (1/t) == (1/n)) { counter++; System.out.println(counter); } } } if (i*t == maxiter) break; if (counter < 1000) { counter = 0; n++; } else { System.out.println("Counterr: " + counter); System.out.println("Answer: " + n); System.exit(0); } }