【发布时间】:2020-02-20 16:35:11
【问题描述】:
我正在尝试得到所有的毕达哥拉斯四元组:
a^2 + b^2 + c^2 = d^2 when a, b, c <= 1000,
我的代码生成了所有这些 (85490),但大约需要 10 分钟。
我正在尝试减少执行时间。如何提高执行时间?请有任何建议。
这是我的代码。
static int isSquare(int n)
{
int m = (int) Math.sqrt(n);
return m * m == n ? m : 0;
}
static List<List<Integer>> allQuadraples = new ArrayList<>();
static int findQuadraples(int range)
{
int total = 0;
for (int a = 1; a <= range; a++)
for (int b = 1; b <= range; b++)
for (int c = 1; c <= range; c++)
{
int sum = a * a + b * b + c * c;
int d = isSquare(sum);
if (d != 0) // a possible Quadruple
{
List<Integer> oneQuadraple = new ArrayList<>(Arrays.asList(a, b, c, d));
Collections.sort(oneQuadraple); // sorting before insertion for comparing later
if (!allQuadraples.contains(oneQuadraple))
{
System.out.println(oneQuadraple);
allQuadraples.add(oneQuadraple);
total++;
}
}
}
return total;
}
【问题讨论】:
-
请注意,在不更改这种蛮力方法的情况下,您可以通过以下方式获得时间:1. 限制搜索
b>=a和c>= b以及 2. 分解计算a*a和 @987654328 @ -
1.您不想每次都调用 sqrt。您可以创建正方形及其根的地图。 2. 你应该重写你的循环使用(除了上面提到的假设
a<b<c)这些是三角形,所以:a+b>c && a+c>b && b+c>a -
我在 C++ 中测试了我的两个提案,并在大约 1 秒内得到了与您相同的结果,但基本还是蛮力方法,但不需要检查重复项
-
@ManojBanik 在
b>=a和c>= b的条件下,我避免了所有重复。我得到与 OP 相同的总数:85490
标签: java algorithm time-complexity pythagorean