mirror of
https://github.com/TheAlgorithms/Java.git
synced 2025-12-19 07:00:35 +08:00
refactor: improve PythagoreanTriple logic and add parameterized tests (#6350)
This commit is contained in:
committed by
GitHub
parent
2f5bc8c242
commit
fa2ca9db39
@@ -1,36 +1,43 @@
|
||||
package com.thealgorithms.maths;
|
||||
|
||||
/**
|
||||
* https://en.wikipedia.org/wiki/Pythagorean_triple
|
||||
* Utility class to check if three integers form a Pythagorean triple.
|
||||
* A Pythagorean triple consists of three positive integers a, b, and c,
|
||||
* such that a² + b² = c².
|
||||
*
|
||||
* Common examples:
|
||||
* - (3, 4, 5)
|
||||
* - (5, 12, 13)
|
||||
*
|
||||
* Reference: https://en.wikipedia.org/wiki/Pythagorean_triple
|
||||
*/
|
||||
public final class PythagoreanTriple {
|
||||
|
||||
private PythagoreanTriple() {
|
||||
}
|
||||
|
||||
public static void main(String[] args) {
|
||||
assert isPythagTriple(3, 4, 5);
|
||||
assert isPythagTriple(5, 12, 13);
|
||||
assert isPythagTriple(6, 8, 10);
|
||||
assert !isPythagTriple(10, 20, 30);
|
||||
assert !isPythagTriple(6, 8, 100);
|
||||
assert !isPythagTriple(-1, -1, 1);
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a,b,c are a Pythagorean Triple
|
||||
* Checks whether three integers form a Pythagorean triple.
|
||||
* The order of parameters does not matter.
|
||||
*
|
||||
* @param a x/y component length of a right triangle
|
||||
* @param b y/x component length of a right triangle
|
||||
* @param c hypotenuse length of a right triangle
|
||||
* @return boolean <tt>true</tt> if a, b, c satisfy the Pythagorean theorem,
|
||||
* otherwise
|
||||
* <tt>false</tt>
|
||||
* @param a one side length
|
||||
* @param b another side length
|
||||
* @param c another side length
|
||||
* @return {@code true} if (a, b, c) can form a Pythagorean triple, otherwise {@code false}
|
||||
*/
|
||||
public static boolean isPythagTriple(int a, int b, int c) {
|
||||
if (a <= 0 || b <= 0 || c <= 0) {
|
||||
return false;
|
||||
} else {
|
||||
return (a * a) + (b * b) == (c * c);
|
||||
}
|
||||
|
||||
// Sort the sides so the largest is treated as hypotenuse
|
||||
int[] sides = {a, b, c};
|
||||
java.util.Arrays.sort(sides);
|
||||
|
||||
int x = sides[0];
|
||||
int y = sides[1];
|
||||
int hypotenuse = sides[2];
|
||||
|
||||
return x * x + y * y == hypotenuse * hypotenuse;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,22 +1,24 @@
|
||||
package com.thealgorithms.maths;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertFalse;
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.junit.jupiter.params.ParameterizedTest;
|
||||
import org.junit.jupiter.params.provider.CsvSource;
|
||||
|
||||
public class PythagoreanTripleTest {
|
||||
|
||||
@ParameterizedTest
|
||||
@CsvSource({"3, 4, 5, true", "6, 8, 10, true", "9, 12, 15, true", "12, 16, 20, true", "15, 20, 25, true", "18, 24, 30, true", "5, 20, 30, false", "6, 8, 100, false", "-2, -2, 2, false", "0, 0, 0, false", "5, 5, 5, false"})
|
||||
void testIsPythagoreanTriple(int a, int b, int c, boolean expected) {
|
||||
assertEquals(expected, PythagoreanTriple.isPythagTriple(a, b, c));
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testPythagoreanTriple() {
|
||||
assertTrue(PythagoreanTriple.isPythagTriple(3, 4, 5));
|
||||
assertTrue(PythagoreanTriple.isPythagTriple(6, 8, 10));
|
||||
assertTrue(PythagoreanTriple.isPythagTriple(9, 12, 15));
|
||||
assertTrue(PythagoreanTriple.isPythagTriple(12, 16, 20));
|
||||
assertTrue(PythagoreanTriple.isPythagTriple(15, 20, 25));
|
||||
assertTrue(PythagoreanTriple.isPythagTriple(18, 24, 30));
|
||||
assertFalse(PythagoreanTriple.isPythagTriple(5, 20, 30));
|
||||
assertFalse(PythagoreanTriple.isPythagTriple(6, 8, 100));
|
||||
assertFalse(PythagoreanTriple.isPythagTriple(-2, -2, 2));
|
||||
void testUnorderedInputStillValid() {
|
||||
// Should still detect Pythagorean triples regardless of argument order
|
||||
assertTrue(PythagoreanTriple.isPythagTriple(5, 3, 4));
|
||||
assertTrue(PythagoreanTriple.isPythagTriple(13, 12, 5));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user