Skip to content

Commit 20612eb

Browse files
fix: reject negative input in SumOfSquares and add tests
1 parent af9aad3 commit 20612eb

2 files changed

Lines changed: 28 additions & 16 deletions

File tree

src/main/java/com/thealgorithms/maths/SumOfSquares.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@
55
* Find minimum number of perfect squares that sum to given number
66
*
77
* @see <a href="https://en.wikipedia.org/wiki/Lagrange%27s_four-square_theorem">Lagrange's Four Square Theorem</a>
8-
* @author BEASTSHRIRAM
98
*/
109
public final class SumOfSquares {
1110

@@ -16,10 +15,15 @@ private SumOfSquares() {
1615
/**
1716
* Find minimum number of perfect squares that sum to n
1817
*
19-
* @param n the target number
18+
* @param n the target number (must be non-negative)
2019
* @return minimum number of squares needed
20+
* @throws IllegalArgumentException if n is negative
2121
*/
2222
public static int minSquares(int n) {
23+
if (n < 0) {
24+
throw new IllegalArgumentException("Input must be non-negative");
25+
}
26+
2327
if (isPerfectSquare(n)) {
2428
return 1;
2529
}
@@ -51,3 +55,4 @@ private static boolean isPerfectSquare(int n) {
5155
return root * root == n;
5256
}
5357
}
58+
Lines changed: 21 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,40 @@
11
package com.thealgorithms.maths;
22

33
import static org.junit.jupiter.api.Assertions.assertEquals;
4+
import static org.junit.jupiter.api.Assertions.assertThrows;
45

56
import org.junit.jupiter.api.Test;
67

78
/**
89
* Test class for SumOfSquares
9-
*
10-
* @author BEASTSHRIRAM
1110
*/
1211
class SumOfSquaresTest {
1312

1413
@Test
1514
void testPerfectSquares() {
1615
// Perfect squares should return 1
17-
assertEquals(1, SumOfSquares.minSquares(1)); // 1^2
18-
assertEquals(1, SumOfSquares.minSquares(4)); // 2^2
19-
assertEquals(1, SumOfSquares.minSquares(9)); // 3^2
16+
assertEquals(1, SumOfSquares.minSquares(1)); // 1^2
17+
assertEquals(1, SumOfSquares.minSquares(4)); // 2^2
18+
assertEquals(1, SumOfSquares.minSquares(9)); // 3^2
2019
assertEquals(1, SumOfSquares.minSquares(16)); // 4^2
2120
assertEquals(1, SumOfSquares.minSquares(25)); // 5^2
2221
}
2322

2423
@Test
2524
void testTwoSquares() {
2625
// Numbers that can be expressed as sum of two squares
27-
assertEquals(2, SumOfSquares.minSquares(2)); // 1^2 + 1^2
28-
assertEquals(2, SumOfSquares.minSquares(5)); // 1^2 + 2^2
29-
assertEquals(2, SumOfSquares.minSquares(8)); // 2^2 + 2^2
26+
assertEquals(2, SumOfSquares.minSquares(2)); // 1^2 + 1^2
27+
assertEquals(2, SumOfSquares.minSquares(5)); // 1^2 + 2^2
28+
assertEquals(2, SumOfSquares.minSquares(8)); // 2^2 + 2^2
3029
assertEquals(2, SumOfSquares.minSquares(10)); // 1^2 + 3^2
3130
assertEquals(2, SumOfSquares.minSquares(13)); // 2^2 + 3^2
3231
}
3332

3433
@Test
3534
void testThreeSquares() {
3635
// Numbers that require exactly three squares
37-
assertEquals(3, SumOfSquares.minSquares(3)); // 1^2 + 1^2 + 1^2
38-
assertEquals(3, SumOfSquares.minSquares(6)); // 1^2 + 1^2 + 2^2
36+
assertEquals(3, SumOfSquares.minSquares(3)); // 1^2 + 1^2 + 1^2
37+
assertEquals(3, SumOfSquares.minSquares(6)); // 1^2 + 1^2 + 2^2
3938
assertEquals(3, SumOfSquares.minSquares(11)); // 1^2 + 1^2 + 3^2
4039
assertEquals(3, SumOfSquares.minSquares(12)); // 2^2 + 2^2 + 2^2
4140
assertEquals(3, SumOfSquares.minSquares(14)); // 1^2 + 2^2 + 3^2
@@ -44,7 +43,7 @@ void testThreeSquares() {
4443
@Test
4544
void testFourSquares() {
4645
// Numbers that require exactly four squares (form 4^a * (8b + 7))
47-
assertEquals(4, SumOfSquares.minSquares(7)); // 1^2 + 1^2 + 1^2 + 2^2
46+
assertEquals(4, SumOfSquares.minSquares(7)); // 1^2 + 1^2 + 1^2 + 2^2
4847
assertEquals(4, SumOfSquares.minSquares(15)); // 1^2 + 1^2 + 2^2 + 3^2
4948
assertEquals(4, SumOfSquares.minSquares(23)); // 1^2 + 1^2 + 3^2 + 3^2
5049
assertEquals(4, SumOfSquares.minSquares(28)); // 4 * 7, so needs 4 squares
@@ -55,14 +54,22 @@ void testFourSquares() {
5554
void testLargerNumbers() {
5655
// Test some larger numbers
5756
assertEquals(1, SumOfSquares.minSquares(100)); // 10^2
58-
assertEquals(2, SumOfSquares.minSquares(65)); // 1^2 + 8^2
59-
assertEquals(3, SumOfSquares.minSquares(19)); // 1^2 + 3^2 + 3^2
60-
assertEquals(4, SumOfSquares.minSquares(60)); // 4 * 15, and 15 = 8*1 + 7
57+
assertEquals(2, SumOfSquares.minSquares(65)); // 1^2 + 8^2
58+
assertEquals(3, SumOfSquares.minSquares(19)); // 1^2 + 3^2 + 3^2
59+
assertEquals(4, SumOfSquares.minSquares(60)); // 4 * 15, and 15 = 8*1 + 7
6160
}
6261

6362
@Test
6463
void testEdgeCases() {
6564
// Test edge case
6665
assertEquals(1, SumOfSquares.minSquares(0)); // 0^2
6766
}
67+
68+
@Test
69+
void testNegativeInput() {
70+
// Negative inputs should throw IllegalArgumentException
71+
assertThrows(IllegalArgumentException.class, () -> SumOfSquares.minSquares(-1));
72+
assertThrows(IllegalArgumentException.class, () -> SumOfSquares.minSquares(-10));
73+
}
6874
}
75+

0 commit comments

Comments
 (0)