Armstrong Number in Java (#12637)
This commit is contained in:
parent
876d78b188
commit
18d1cb40dc
@ -0,0 +1,44 @@
|
|||||||
|
package com.baeldung.armstrong;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.stream.Collectors;
|
||||||
|
import java.util.stream.IntStream;
|
||||||
|
|
||||||
|
public class ArmstrongNumberUtil {
|
||||||
|
|
||||||
|
public static boolean isArmstrong(int n) {
|
||||||
|
if (n < 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
List<Integer> digitsList = digitsInList(n);
|
||||||
|
int len = digitsList.size();
|
||||||
|
int sum = digitsList.stream()
|
||||||
|
.mapToInt(d -> (int) Math.pow(d, len))
|
||||||
|
.sum();
|
||||||
|
// alternatively, we can use the reduce() method:
|
||||||
|
// int sum = digits.stream()
|
||||||
|
// .reduce(0, (subtotal, digit) -> subtotal + (int) Math.pow(digit, len));
|
||||||
|
return n == sum;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static List<Integer> digitsInList(int n) {
|
||||||
|
List<Integer> list = new ArrayList<>();
|
||||||
|
while (n > 0) {
|
||||||
|
list.add(n % 10);
|
||||||
|
n = n / 10;
|
||||||
|
}
|
||||||
|
return list;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static List<Integer> getA005188Sequence(int limit) {
|
||||||
|
if (limit < 0) {
|
||||||
|
throw new IllegalArgumentException("The limit cannot be a negative number.");
|
||||||
|
}
|
||||||
|
return IntStream.range(0, limit)
|
||||||
|
.boxed()
|
||||||
|
.filter(ArmstrongNumberUtil::isArmstrong)
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,40 @@
|
|||||||
|
package com.baeldung.armstrong;
|
||||||
|
|
||||||
|
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
|
import com.google.common.collect.ImmutableList;
|
||||||
|
import com.google.common.collect.ImmutableMap;
|
||||||
|
|
||||||
|
class ArmstrongNumberUtilUnitTest {
|
||||||
|
// @formatter:off
|
||||||
|
private static final Map<Integer, Boolean> ARMSTRONG_MAP = ImmutableMap.of(
|
||||||
|
0, true,
|
||||||
|
1, true,
|
||||||
|
2, true,
|
||||||
|
153, true,
|
||||||
|
370, true,
|
||||||
|
407, true,
|
||||||
|
42, false,
|
||||||
|
777, false,
|
||||||
|
12345, false);
|
||||||
|
// @formatter:on
|
||||||
|
|
||||||
|
private static final List<Integer> A005188_SEQ_1K = ImmutableList.of(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 153, 370, 371, 407);
|
||||||
|
private static final List<Integer> A005188_SEQ_10K = ImmutableList.of(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 153, 370, 371, 407, 1634, 8208, 9474);
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenIntegers_whenCheckArmstrong_shouldReturnExpectedResult() {
|
||||||
|
ARMSTRONG_MAP.forEach((number, result) -> assertEquals(result, ArmstrongNumberUtil.isArmstrong(number)));
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void givenALimit_whenFindArmstrong_shouldReturnExpectedResult() {
|
||||||
|
assertEquals(A005188_SEQ_1K, ArmstrongNumberUtil.getA005188Sequence(1000));
|
||||||
|
assertEquals(A005188_SEQ_10K, ArmstrongNumberUtil.getA005188Sequence(10000));
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user