我想找到整数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时发生。为什么?
答案 0 :(得分:0)
这可能是因为浮点精度问题。您在循环中对double使用增量++
运算符,并将双精度数与==
进行比较。这些操作的结果可能不如预期,特别是在多次迭代之后。
尝试更改代码以使用精确精确的整数,而不是双精度。请注意你的等式
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);
}
}
}
此外,现在更清楚如何优化迭代范围。考虑i
和t
的下限和上限 - 减少迭代范围将显着提高整体性能。
不幸的是,我目前还没有对结果进行测试,但我很确定你应该用整数进行计算,而不是用双精度计算。
答案 1 :(得分:-1)
您没有提供Netbeans中弹出的错误代码。但我假设有一个outofbounds错误。或异常错误。它找不到1000,因为你的while循环是无限的。当“组合”达到1000
时,您必须能够停止循环答案 2 :(得分:-1)
尝试在内部循环中使用比10000
更高的数字来增加搜索空间。也许9999999
?
我认为,对于使用1/z + 1/x = 1/n
的同一n
,您发现{z,x,n} in [1...10000]
的1000种组合的可能性极小。
编辑。
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);
}
}