Skip to content

Commit 91c045c

Browse files
added program for evil number
1 parent a4cf6e3 commit 91c045c

File tree

2 files changed

+67
-0
lines changed

2 files changed

+67
-0
lines changed
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
package com.thealgorithms.maths;
2+
3+
/**
4+
* In number theory, an evil number is a non-negative integer that has an even number of 1s in its binary expansion.
5+
* Non-negative integers that are not evil are called odious numbers.
6+
*
7+
* Evil Number Wiki: https://en.wikipedia.org/wiki/Evil_number
8+
* Odious Number Wiki: https://en.wikipedia.org/wiki/Odious_number
9+
*/
10+
public final class EvilNumber {
11+
12+
private EvilNumber() {
13+
}
14+
15+
// Function to count number of one bits in a number using bitwise operators
16+
private static int countOneBits(int number) {
17+
int oneBitCounter = 0;
18+
while (number > 0) {
19+
oneBitCounter += number & 1; // increment count if last bit is 1
20+
number >>= 1; // right shift to next bit
21+
}
22+
return oneBitCounter;
23+
}
24+
25+
/**
26+
* Check either {@code number} is an Evil number or Odious number
27+
*
28+
* @param number the number
29+
* @return {@code true} if {@code number} is an Evil number, otherwise false (in case of of Odious number)
30+
*/
31+
public static boolean isEvilNumber(int number) {
32+
if (number < 0) {
33+
throw new IllegalArgumentException("Negative numbers are not allowed.");
34+
}
35+
36+
int noOfOneBits = countOneBits(number);
37+
return noOfOneBits % 2 == 0;
38+
}
39+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.thealgorithms.maths;
2+
3+
import static org.junit.jupiter.api.Assertions.assertFalse;
4+
import static org.junit.jupiter.api.Assertions.assertThrows;
5+
import static org.junit.jupiter.api.Assertions.assertTrue;
6+
7+
import org.junit.jupiter.params.ParameterizedTest;
8+
import org.junit.jupiter.params.provider.CsvSource;
9+
10+
class EvilNumberTest {
11+
@ParameterizedTest
12+
@CsvSource({"0", "3", "10", "129", "222", "500", "777", "1198"})
13+
void evilNumbersTest(int n) {
14+
assertTrue(EvilNumber.isEvilNumber(n));
15+
}
16+
17+
@ParameterizedTest
18+
@CsvSource({"1", "7", "100", "333", "555", "1199"})
19+
void odiousNumbersTest(int n) {
20+
assertFalse(EvilNumber.isEvilNumber(n));
21+
}
22+
23+
@ParameterizedTest
24+
@CsvSource({"-1"})
25+
void throwsNegativeNumbersNotAllowed(int n) {
26+
assertThrows(IllegalArgumentException.class, () -> EvilNumber.isEvilNumber(n));
27+
}
28+
}

0 commit comments

Comments
 (0)