From 20612eba18e8d46dbcaa0a6096debb0fb016020c Mon Sep 17 00:00:00 2001 From: Rohit Date: Sun, 26 Jul 2026 07:01:32 +0530 Subject: [PATCH 1/2] fix: reject negative input in SumOfSquares and add tests --- .../com/thealgorithms/maths/SumOfSquares.java | 9 +++-- .../thealgorithms/maths/SumOfSquaresTest.java | 35 +++++++++++-------- 2 files changed, 28 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/thealgorithms/maths/SumOfSquares.java b/src/main/java/com/thealgorithms/maths/SumOfSquares.java index c050d5a75f7b..61761c71c4fa 100644 --- a/src/main/java/com/thealgorithms/maths/SumOfSquares.java +++ b/src/main/java/com/thealgorithms/maths/SumOfSquares.java @@ -5,7 +5,6 @@ * Find minimum number of perfect squares that sum to given number * * @see Lagrange's Four Square Theorem - * @author BEASTSHRIRAM */ public final class SumOfSquares { @@ -16,10 +15,15 @@ private SumOfSquares() { /** * Find minimum number of perfect squares that sum to n * - * @param n the target number + * @param n the target number (must be non-negative) * @return minimum number of squares needed + * @throws IllegalArgumentException if n is negative */ public static int minSquares(int n) { + if (n < 0) { + throw new IllegalArgumentException("Input must be non-negative"); + } + if (isPerfectSquare(n)) { return 1; } @@ -51,3 +55,4 @@ private static boolean isPerfectSquare(int n) { return root * root == n; } } + diff --git a/src/test/java/com/thealgorithms/maths/SumOfSquaresTest.java b/src/test/java/com/thealgorithms/maths/SumOfSquaresTest.java index 834fe61a049e..ad4f37219a66 100644 --- a/src/test/java/com/thealgorithms/maths/SumOfSquaresTest.java +++ b/src/test/java/com/thealgorithms/maths/SumOfSquaresTest.java @@ -1,22 +1,21 @@ package com.thealgorithms.maths; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertThrows; import org.junit.jupiter.api.Test; /** * Test class for SumOfSquares - * - * @author BEASTSHRIRAM */ class SumOfSquaresTest { @Test void testPerfectSquares() { // Perfect squares should return 1 - assertEquals(1, SumOfSquares.minSquares(1)); // 1^2 - assertEquals(1, SumOfSquares.minSquares(4)); // 2^2 - assertEquals(1, SumOfSquares.minSquares(9)); // 3^2 + assertEquals(1, SumOfSquares.minSquares(1)); // 1^2 + assertEquals(1, SumOfSquares.minSquares(4)); // 2^2 + assertEquals(1, SumOfSquares.minSquares(9)); // 3^2 assertEquals(1, SumOfSquares.minSquares(16)); // 4^2 assertEquals(1, SumOfSquares.minSquares(25)); // 5^2 } @@ -24,9 +23,9 @@ void testPerfectSquares() { @Test void testTwoSquares() { // Numbers that can be expressed as sum of two squares - assertEquals(2, SumOfSquares.minSquares(2)); // 1^2 + 1^2 - assertEquals(2, SumOfSquares.minSquares(5)); // 1^2 + 2^2 - assertEquals(2, SumOfSquares.minSquares(8)); // 2^2 + 2^2 + assertEquals(2, SumOfSquares.minSquares(2)); // 1^2 + 1^2 + assertEquals(2, SumOfSquares.minSquares(5)); // 1^2 + 2^2 + assertEquals(2, SumOfSquares.minSquares(8)); // 2^2 + 2^2 assertEquals(2, SumOfSquares.minSquares(10)); // 1^2 + 3^2 assertEquals(2, SumOfSquares.minSquares(13)); // 2^2 + 3^2 } @@ -34,8 +33,8 @@ void testTwoSquares() { @Test void testThreeSquares() { // Numbers that require exactly three squares - assertEquals(3, SumOfSquares.minSquares(3)); // 1^2 + 1^2 + 1^2 - assertEquals(3, SumOfSquares.minSquares(6)); // 1^2 + 1^2 + 2^2 + assertEquals(3, SumOfSquares.minSquares(3)); // 1^2 + 1^2 + 1^2 + assertEquals(3, SumOfSquares.minSquares(6)); // 1^2 + 1^2 + 2^2 assertEquals(3, SumOfSquares.minSquares(11)); // 1^2 + 1^2 + 3^2 assertEquals(3, SumOfSquares.minSquares(12)); // 2^2 + 2^2 + 2^2 assertEquals(3, SumOfSquares.minSquares(14)); // 1^2 + 2^2 + 3^2 @@ -44,7 +43,7 @@ void testThreeSquares() { @Test void testFourSquares() { // Numbers that require exactly four squares (form 4^a * (8b + 7)) - assertEquals(4, SumOfSquares.minSquares(7)); // 1^2 + 1^2 + 1^2 + 2^2 + assertEquals(4, SumOfSquares.minSquares(7)); // 1^2 + 1^2 + 1^2 + 2^2 assertEquals(4, SumOfSquares.minSquares(15)); // 1^2 + 1^2 + 2^2 + 3^2 assertEquals(4, SumOfSquares.minSquares(23)); // 1^2 + 1^2 + 3^2 + 3^2 assertEquals(4, SumOfSquares.minSquares(28)); // 4 * 7, so needs 4 squares @@ -55,9 +54,9 @@ void testFourSquares() { void testLargerNumbers() { // Test some larger numbers assertEquals(1, SumOfSquares.minSquares(100)); // 10^2 - assertEquals(2, SumOfSquares.minSquares(65)); // 1^2 + 8^2 - assertEquals(3, SumOfSquares.minSquares(19)); // 1^2 + 3^2 + 3^2 - assertEquals(4, SumOfSquares.minSquares(60)); // 4 * 15, and 15 = 8*1 + 7 + assertEquals(2, SumOfSquares.minSquares(65)); // 1^2 + 8^2 + assertEquals(3, SumOfSquares.minSquares(19)); // 1^2 + 3^2 + 3^2 + assertEquals(4, SumOfSquares.minSquares(60)); // 4 * 15, and 15 = 8*1 + 7 } @Test @@ -65,4 +64,12 @@ void testEdgeCases() { // Test edge case assertEquals(1, SumOfSquares.minSquares(0)); // 0^2 } + + @Test + void testNegativeInput() { + // Negative inputs should throw IllegalArgumentException + assertThrows(IllegalArgumentException.class, () -> SumOfSquares.minSquares(-1)); + assertThrows(IllegalArgumentException.class, () -> SumOfSquares.minSquares(-10)); + } } + From 315862942b4590c5c6586c06eacba8e317a0cef7 Mon Sep 17 00:00:00 2001 From: Rohit Date: Sun, 26 Jul 2026 07:16:03 +0530 Subject: [PATCH 2/2] style: apply clang-format to SumOfSquares and its test --- .../com/thealgorithms/maths/SumOfSquares.java | 1 - .../thealgorithms/maths/SumOfSquaresTest.java | 25 +++++++++---------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/thealgorithms/maths/SumOfSquares.java b/src/main/java/com/thealgorithms/maths/SumOfSquares.java index 61761c71c4fa..77acbcc2a609 100644 --- a/src/main/java/com/thealgorithms/maths/SumOfSquares.java +++ b/src/main/java/com/thealgorithms/maths/SumOfSquares.java @@ -55,4 +55,3 @@ private static boolean isPerfectSquare(int n) { return root * root == n; } } - diff --git a/src/test/java/com/thealgorithms/maths/SumOfSquaresTest.java b/src/test/java/com/thealgorithms/maths/SumOfSquaresTest.java index ad4f37219a66..02b3f614ca9a 100644 --- a/src/test/java/com/thealgorithms/maths/SumOfSquaresTest.java +++ b/src/test/java/com/thealgorithms/maths/SumOfSquaresTest.java @@ -13,9 +13,9 @@ class SumOfSquaresTest { @Test void testPerfectSquares() { // Perfect squares should return 1 - assertEquals(1, SumOfSquares.minSquares(1)); // 1^2 - assertEquals(1, SumOfSquares.minSquares(4)); // 2^2 - assertEquals(1, SumOfSquares.minSquares(9)); // 3^2 + assertEquals(1, SumOfSquares.minSquares(1)); // 1^2 + assertEquals(1, SumOfSquares.minSquares(4)); // 2^2 + assertEquals(1, SumOfSquares.minSquares(9)); // 3^2 assertEquals(1, SumOfSquares.minSquares(16)); // 4^2 assertEquals(1, SumOfSquares.minSquares(25)); // 5^2 } @@ -23,9 +23,9 @@ void testPerfectSquares() { @Test void testTwoSquares() { // Numbers that can be expressed as sum of two squares - assertEquals(2, SumOfSquares.minSquares(2)); // 1^2 + 1^2 - assertEquals(2, SumOfSquares.minSquares(5)); // 1^2 + 2^2 - assertEquals(2, SumOfSquares.minSquares(8)); // 2^2 + 2^2 + assertEquals(2, SumOfSquares.minSquares(2)); // 1^2 + 1^2 + assertEquals(2, SumOfSquares.minSquares(5)); // 1^2 + 2^2 + assertEquals(2, SumOfSquares.minSquares(8)); // 2^2 + 2^2 assertEquals(2, SumOfSquares.minSquares(10)); // 1^2 + 3^2 assertEquals(2, SumOfSquares.minSquares(13)); // 2^2 + 3^2 } @@ -33,8 +33,8 @@ void testTwoSquares() { @Test void testThreeSquares() { // Numbers that require exactly three squares - assertEquals(3, SumOfSquares.minSquares(3)); // 1^2 + 1^2 + 1^2 - assertEquals(3, SumOfSquares.minSquares(6)); // 1^2 + 1^2 + 2^2 + assertEquals(3, SumOfSquares.minSquares(3)); // 1^2 + 1^2 + 1^2 + assertEquals(3, SumOfSquares.minSquares(6)); // 1^2 + 1^2 + 2^2 assertEquals(3, SumOfSquares.minSquares(11)); // 1^2 + 1^2 + 3^2 assertEquals(3, SumOfSquares.minSquares(12)); // 2^2 + 2^2 + 2^2 assertEquals(3, SumOfSquares.minSquares(14)); // 1^2 + 2^2 + 3^2 @@ -43,7 +43,7 @@ void testThreeSquares() { @Test void testFourSquares() { // Numbers that require exactly four squares (form 4^a * (8b + 7)) - assertEquals(4, SumOfSquares.minSquares(7)); // 1^2 + 1^2 + 1^2 + 2^2 + assertEquals(4, SumOfSquares.minSquares(7)); // 1^2 + 1^2 + 1^2 + 2^2 assertEquals(4, SumOfSquares.minSquares(15)); // 1^2 + 1^2 + 2^2 + 3^2 assertEquals(4, SumOfSquares.minSquares(23)); // 1^2 + 1^2 + 3^2 + 3^2 assertEquals(4, SumOfSquares.minSquares(28)); // 4 * 7, so needs 4 squares @@ -54,9 +54,9 @@ void testFourSquares() { void testLargerNumbers() { // Test some larger numbers assertEquals(1, SumOfSquares.minSquares(100)); // 10^2 - assertEquals(2, SumOfSquares.minSquares(65)); // 1^2 + 8^2 - assertEquals(3, SumOfSquares.minSquares(19)); // 1^2 + 3^2 + 3^2 - assertEquals(4, SumOfSquares.minSquares(60)); // 4 * 15, and 15 = 8*1 + 7 + assertEquals(2, SumOfSquares.minSquares(65)); // 1^2 + 8^2 + assertEquals(3, SumOfSquares.minSquares(19)); // 1^2 + 3^2 + 3^2 + assertEquals(4, SumOfSquares.minSquares(60)); // 4 * 15, and 15 = 8*1 + 7 } @Test @@ -72,4 +72,3 @@ void testNegativeInput() { assertThrows(IllegalArgumentException.class, () -> SumOfSquares.minSquares(-10)); } } -