Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
58 changes: 58 additions & 0 deletions src/main/java/com/thealgorithms/maths/AbundantNumber.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package com.thealgorithms.maths;

/**
* In number theory, an abundant number or excessive number is a positive integer for which
* the sum of its proper divisors is greater than the number.
* Equivalently, it is a number for which the sum of proper divisors (or aliquot sum) is greater than n.
*
* The integer 12 is the first abundant number. Its proper divisors are 1, 2, 3, 4 and 6 for a total of 16.
*
* Wiki: https://en.wikipedia.org/wiki/Abundant_number
*/
public final class AbundantNumber {

private AbundantNumber() {
}

// Function to calculate sum of all divisors including n
private static int sumOfDivisors(int n) {
int sum = 1 + n; // 1 and n are always divisors
for (int i = 2; i <= n / 2; i++) {
if (n % i == 0) {
sum += i; // adding divisor to sum
}
}
return sum;
}

// Common validation method
private static void validatePositiveNumber(int number) {
if (number <= 0) {
throw new IllegalArgumentException("Number must be positive.");
}
}

/**
* Check if {@code number} is an Abundant number or not by checking sum of divisors > 2n
*
* @param number the number
* @return {@code true} if {@code number} is an Abundant number, otherwise false
*/
public static boolean isAbundant(int number) {
validatePositiveNumber(number);

return sumOfDivisors(number) > 2 * number;
}

/**
* Check if {@code number} is an Abundant number or not by checking Aliquot Sum > n
*
* @param number the number
* @return {@code true} if {@code number} is a Abundant number, otherwise false
*/
public static boolean isAbundantNumber(int number) {
validatePositiveNumber(number);

return AliquotSum.getAliquotSum(number) > number;
}
}
31 changes: 31 additions & 0 deletions src/test/java/com/thealgorithms/maths/AbundantNumberTest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.thealgorithms.maths;

import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;

import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;

class AbundantNumberTest {
@ParameterizedTest
@CsvSource({"12", "66", "222", "444", "888", "2424"})
void abundantNumbersTest(int n) {
assertTrue(AbundantNumber.isAbundant(n));
assertTrue(AbundantNumber.isAbundantNumber(n));
}

@ParameterizedTest
@CsvSource({"1", "2", "6", "111", "333", "2222"})
void nonAbundantNumbersTest(int n) {
assertFalse(AbundantNumber.isAbundant(n));
assertFalse(AbundantNumber.isAbundantNumber(n));
}

@ParameterizedTest
@CsvSource({"0", "-1"})
void throwsNegativeNumbersNotAllowed(int n) {
assertThrows(IllegalArgumentException.class, () -> AbundantNumber.isAbundant(n));
assertThrows(IllegalArgumentException.class, () -> AbundantNumber.isAbundantNumber(n));
}
}