Skip to content

Commit d418bbd

Browse files
TaranjeetSinghKalsiDebasish Biswas
and
Debasish Biswas
authored
Created PerfectNumberTest.java & Added function in PerfectNumber.java (TheAlgorithms#3751)
* Added function in PerfectNumber.java Added isPerfectNumber2() in PerfectNumber.java * Created PerfectNumberTest.java * fixed isPerfectNumber() fixed bug in isPerfectNumber() for negative numbers * fixed typo Co-authored-by: Debasish Biswas <debasishbsws.abc@gmail.com>
1 parent 5864f32 commit d418bbd

File tree

2 files changed

+57
-10
lines changed

2 files changed

+57
-10
lines changed

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

Lines changed: 36 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,27 +6,19 @@
66
* has divisors 1, 2 and 3 (excluding itself), and 1 + 2 + 3 = 6, so 6 is a
77
* perfect number.
88
*
9-
* <p>
109
* link:https://en.wikipedia.org/wiki/Perfect_number
1110
*/
1211
public class PerfectNumber {
1312

14-
public static void main(String[] args) {
15-
assert isPerfectNumber(6);
16-
/* 1 + 2 + 3 == 6 */
17-
assert !isPerfectNumber(8);
18-
/* 1 + 2 + 4 != 8 */
19-
assert isPerfectNumber(28);
20-
/* 1 + 2 + 4 + 7 + 14 == 28 */
21-
}
22-
2313
/**
2414
* Check if {@code number} is perfect number or not
2515
*
2616
* @param number the number
2717
* @return {@code true} if {@code number} is perfect number, otherwise false
2818
*/
2919
public static boolean isPerfectNumber(int number) {
20+
if (number <= 0)
21+
return false;
3022
int sum = 0;
3123
/* sum of its positive divisors */
3224
for (int i = 1; i < number; ++i) {
@@ -36,4 +28,38 @@ public static boolean isPerfectNumber(int number) {
3628
}
3729
return sum == number;
3830
}
31+
32+
/**
33+
* Check if {@code n} is perfect number or not
34+
*
35+
* @param n the number
36+
* @return {@code true} if {@code number} is perfect number, otherwise false
37+
*/
38+
public static boolean isPerfectNumber2(int n) {
39+
if (n <= 0)
40+
return false;
41+
int sum = 1;
42+
double root = Math.sqrt(n);
43+
44+
/*
45+
* We can get the factors after the root by dividing number by its factors
46+
* before the root.
47+
* Ex- Factors of 100 are 1, 2, 4, 5, 10, 20, 25, 50 and 100.
48+
* Root of 100 is 10. So factors before 10 are 1, 2, 4 and 5.
49+
* Now by dividing 100 by each factor before 10 we get:
50+
* 100/1 = 100, 100/2 = 50, 100/4 = 25 and 100/5 = 20
51+
* So we get 100, 50, 25 and 20 which are factors of 100 after 10
52+
*/
53+
for (int i = 2; i <= root; i++) {
54+
if (n % i == 0) {
55+
sum += i + n / i;
56+
}
57+
}
58+
59+
// if n is a perfect square then its root was added twice in above loop, so subtracting root from sum
60+
if (root == (int) root)
61+
sum -= root;
62+
63+
return sum == n;
64+
}
3965
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.thealgorithms.maths;
2+
3+
import static org.junit.jupiter.api.Assertions.*;
4+
import org.junit.jupiter.api.Test;
5+
6+
class PerfectNumberTest {
7+
8+
@Test
9+
public void perfectNumber() {
10+
int trueTestCases[] = { 6, 28, 496, 8128, 33550336 };
11+
int falseTestCases[] = { -6, 0, 1, 9, 123 };
12+
for (Integer n : trueTestCases) {
13+
assertTrue(PerfectNumber.isPerfectNumber(n));
14+
assertTrue(PerfectNumber.isPerfectNumber2(n));
15+
}
16+
for (Integer n : falseTestCases) {
17+
assertFalse(PerfectNumber.isPerfectNumber(n));
18+
assertFalse(PerfectNumber.isPerfectNumber2(n));
19+
}
20+
}
21+
}

0 commit comments

Comments
 (0)