From ec421fa118c73a7bc6afaae3fbd65af8a3b03542 Mon Sep 17 00:00:00 2001 From: subhroblkbox Date: Tue, 4 Jan 2022 08:50:12 +0530 Subject: [PATCH 1/2] Added kaprekarNumberInRange --- .../thealgorithms/maths/KaprekarNumbers.java | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/thealgorithms/maths/KaprekarNumbers.java b/src/main/java/com/thealgorithms/maths/KaprekarNumbers.java index c922ab25d8cc..d03854b8dc94 100644 --- a/src/main/java/com/thealgorithms/maths/KaprekarNumbers.java +++ b/src/main/java/com/thealgorithms/maths/KaprekarNumbers.java @@ -1,4 +1,5 @@ package com.thealgorithms.maths; +import java.util.*; public class KaprekarNumbers { @@ -6,15 +7,27 @@ public class KaprekarNumbers { Kaprekar Number: A Kaprekar number is an n-digit number which its square can be split into two parts where the right part has n digits and sum of these parts is equal to the original number. */ - // Checks whether a given number is Kaprekar Number or not + // Provides a list of kaprekarNumber in a range + public static ArrayList kaprekarNumberInRange(long start, long end) throws Exception { + long n = end-start; + if (n <0) throw new Exception("Invalid range"); + ArrayList list = new ArrayList<>(); + + for (long i = start; i <= end; i++) { + if (isKaprekarNumber(i)) list.add(i); + } - public static boolean isKaprekarNumber(long number) { + return list; + } + + // Checks whether a given number is Kaprekar Number or not + public static boolean isKaprekarNumber(long number) { long numberSquared = number * number; if(Long.toString(number).length() == Long.toString(numberSquared).length()){ return (number == numberSquared); } else{ - long leftDigits1 = 0, leftDigits2 = 0; + long leftDigits1 = 0, leftDigits2; if(Long.toString(numberSquared).contains("0")){ leftDigits1 = Long.parseLong(Long.toString(numberSquared).substring(0, Long.toString(numberSquared).indexOf("0"))); } From 24fd612b19f0fb14437dcc8197098e0e4df0ad4b Mon Sep 17 00:00:00 2001 From: subhroblkbox Date: Sat, 8 Jan 2022 13:27:23 +0530 Subject: [PATCH 2/2] added bigNumber support for kaprekar number --- .../thealgorithms/maths/KaprekarNumbers.java | 33 +++++++++++++------ .../maths/KaprekarNumbersTest.java | 14 +++++++- 2 files changed, 36 insertions(+), 11 deletions(-) diff --git a/src/main/java/com/thealgorithms/maths/KaprekarNumbers.java b/src/main/java/com/thealgorithms/maths/KaprekarNumbers.java index d03854b8dc94..7cdd182ab119 100644 --- a/src/main/java/com/thealgorithms/maths/KaprekarNumbers.java +++ b/src/main/java/com/thealgorithms/maths/KaprekarNumbers.java @@ -1,4 +1,5 @@ package com.thealgorithms.maths; +import java.math.BigInteger; import java.util.*; public class KaprekarNumbers { @@ -21,19 +22,31 @@ public static ArrayList kaprekarNumberInRange(long start, long end) throws } // Checks whether a given number is Kaprekar Number or not - public static boolean isKaprekarNumber(long number) { - long numberSquared = number * number; - if(Long.toString(number).length() == Long.toString(numberSquared).length()){ - return (number == numberSquared); + public static boolean isKaprekarNumber(long num) { + String number = Long.toString(num); + BigInteger originalNumber = new BigInteger(number); + BigInteger numberSquared = originalNumber.multiply(originalNumber); + if(number.length() == numberSquared.toString().length()){ + return number.equals(numberSquared.toString()); } else{ - long leftDigits1 = 0, leftDigits2; - if(Long.toString(numberSquared).contains("0")){ - leftDigits1 = Long.parseLong(Long.toString(numberSquared).substring(0, Long.toString(numberSquared).indexOf("0"))); + BigInteger leftDigits1 = new BigInteger("0"); + BigInteger leftDigits2; + if(numberSquared.toString().contains("0")){ + leftDigits1 = new BigInteger( + numberSquared.toString(). + substring(0, numberSquared.toString().indexOf("0") + ) + ); } - leftDigits2 = Long.parseLong(Long.toString(numberSquared).substring(0, (Long.toString(numberSquared).length() - Long.toString(number).length()))); - long rightDigits = Long.parseLong(Long.toString(numberSquared).substring(Long.toString(numberSquared).length() - Long.toString(number).length())); - return (number == (leftDigits1 + rightDigits)) || (number == (leftDigits2 + rightDigits)); + leftDigits2 = new BigInteger( + numberSquared.toString() + .substring(0, (numberSquared.toString().length() - number.length())) + ); + BigInteger rightDigits = new BigInteger(numberSquared.toString().substring(numberSquared.toString().length() - number.length())); + String x = leftDigits1.add(rightDigits).toString(); + String y = leftDigits2.add(rightDigits).toString(); + return (number.equals(x)) || (number.equals(y)); } } diff --git a/src/test/java/com/thealgorithms/maths/KaprekarNumbersTest.java b/src/test/java/com/thealgorithms/maths/KaprekarNumbersTest.java index 04f8cc09b670..1d08f810f05e 100644 --- a/src/test/java/com/thealgorithms/maths/KaprekarNumbersTest.java +++ b/src/test/java/com/thealgorithms/maths/KaprekarNumbersTest.java @@ -1,7 +1,7 @@ package com.thealgorithms.maths; import org.junit.jupiter.api.Test; - +import java.util.ArrayList; import static org.junit.jupiter.api.Assertions.*; public class KaprekarNumbersTest { @@ -55,4 +55,16 @@ void testFor98() assertFalse(KaprekarNumbers.isKaprekarNumber(98)); } + @Test + void testForRangeOfNumber() { try { + ArrayList rangedNumbers = KaprekarNumbers.kaprekarNumberInRange(1,100000); + long[] allTheNumbers = {1, 9, 45, 55, 99, 297, 703, 999, 2223, 2728, 4950, 5050, 7272, 7777, 9999, 17344, 22222, 77778, 82656, 95121, 99999}; + for (long i:allTheNumbers) { + assert rangedNumbers.contains(i); + } + } catch (Exception e) { + assert false; + } + } + } \ No newline at end of file