diff --git a/.gitignore b/.gitignore index c2ae10d..b5f1340 100644 --- a/.gitignore +++ b/.gitignore @@ -71,3 +71,8 @@ /out/production/Stack/stack/Stack.class /Stack/Stack.iml /out/production/Stack/stack/StackTest.class +/LychrelNumbers/LychrelNumbers.iml +/out/production/LychrelNumbers/lychrel/LychrelTest.class +/.idea/sonarlint/issuestore/7/1/718d8bc80461d3aa9995862c1883b60a6574e27c +/.idea/sonarlint/securityhotspotstore/7/1/718d8bc80461d3aa9995862c1883b60a6574e27c +/out/production/LychrelNumbers/lychrel/Lychrel.class diff --git a/LychrelNumbers/src/lychrel/Lychrel.java b/LychrelNumbers/src/lychrel/Lychrel.java new file mode 100644 index 0000000..7e00803 --- /dev/null +++ b/LychrelNumbers/src/lychrel/Lychrel.java @@ -0,0 +1,38 @@ +package lychrel; + +import java.math.BigInteger; + +public class Lychrel { + public static int convergesAtIteration(int number, int limit) { + return converge(BigInteger.valueOf(number), 0, limit); + } + + private static int converge(BigInteger number, int iteration, int limit) { + if (!isPalindrome(number) && iteration < limit) + return converge(number.add(reverse(number)), iteration + 1, limit); + else + return iteration; + } + + static BigInteger reverse(BigInteger number) { + char[] nDigits = number.toString().toCharArray(); + char[] rDigits = new char[nDigits.length]; + int lastIndex = nDigits.length - 1; + + for (int idx = 0; idx < nDigits.length; idx++) + rDigits[idx] = nDigits[lastIndex - idx]; + + return new BigInteger(new String(rDigits)); + } + + static boolean isPalindrome(BigInteger number) { + String digits = number.toString(); + int lastIndex = digits.length() - 1; + + for (int idx = 0; idx < digits.length(); idx++) + if (digits.charAt(idx) != digits.charAt(lastIndex - idx)) + return false; + + return true; + } +} diff --git a/LychrelNumbers/src/lychrel/LychrelTest.java b/LychrelNumbers/src/lychrel/LychrelTest.java new file mode 100644 index 0000000..eab2d90 --- /dev/null +++ b/LychrelNumbers/src/lychrel/LychrelTest.java @@ -0,0 +1,71 @@ +package lychrel; + +import org.junit.Ignore; +import org.junit.Test; + +import java.math.BigInteger; + +import static org.junit.Assert.*; + +public class LychrelTest { + + private final int LIMIT = 1000; + + @Test + public void facts(){ + convergesAtIteration(1, 0); + convergesAtIteration(2, 0); + convergesAtIteration(10, 1); + convergesAtIteration(11, 0); + convergesAtIteration(19, 2); + convergesAtIteration(78, 4); + convergesAtIteration(89, 24); + + doesNotConverge(196); + } + + private void doesNotConverge(int number) { + convergesAtIteration(number, LIMIT); + } + + private void convergesAtIteration(int number, int iteration) { + assertEquals(iteration, Lychrel.convergesAtIteration(number, LIMIT)); + } + + @Test + public void palindromes(){ + isPalindrome(1); + isPalindrome(11); + isPalindrome(121); + isPalindrome(12321); + isPalindrome(1234321); + } + + @Test + public void notPalindromes(){ + isNotPalindrome(10); + isNotPalindrome(12331); + isNotPalindrome(124321); + } + + private void isNotPalindrome(int number) { + assertFalse(Lychrel.isPalindrome(BigInteger.valueOf(number))); + } + + private void isPalindrome(int number){ + assertTrue(Lychrel.isPalindrome(BigInteger.valueOf(number))); + } + + @Test + public void reversals(){ + reversed(1,1); + reversed(12, 21); + reversed(13, 31); + reversed(123, 321); + reversed(1234, 4321); + } + + private void reversed(int n, int r) { + assertEquals(BigInteger.valueOf(r), Lychrel.reverse(BigInteger.valueOf(n))); + } +}