我想找到整数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 个组合时,则不起作用。为什么?
这可能是因为浮点精度问题。您使用增量++
循环内的双精度运算符并比较双精度==
。这些操作的结果可能不符合预期,尤其是在多次迭代之后。
尝试更改代码以使用精确精度的整数,而不是双精度数。请注意你的等式
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
and t
- 减少迭代范围将显着提高整体性能。
不幸的是,我目前没有测试结果,但我很确定你应该以整数而不是双精度进行计算。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)