diff --git a/src/main/java/com/thealgorithms/conversions/DecimalToAnyBase.java b/src/main/java/com/thealgorithms/conversions/DecimalToAnyBase.java
index 019c4026b..a5615dc00 100644
--- a/src/main/java/com/thealgorithms/conversions/DecimalToAnyBase.java
+++ b/src/main/java/com/thealgorithms/conversions/DecimalToAnyBase.java
@@ -1,69 +1,69 @@
package com.thealgorithms.conversions;
-import java.io.BufferedReader;
-import java.io.InputStreamReader;
import java.util.ArrayList;
+import java.util.List;
/**
+ * Class that provides methods to convert a decimal number to a string representation
+ * in any specified base between 2 and 36.
+ *
* @author Varun Upadhyay (...)
*/
-// Driver Program
public final class DecimalToAnyBase {
+ private static final int MIN_BASE = 2;
+ private static final int MAX_BASE = 36;
+ private static final char ZERO_CHAR = '0';
+ private static final char A_CHAR = 'A';
+ private static final int DIGIT_OFFSET = 10;
+
private DecimalToAnyBase() {
}
- public static void main(String[] args) throws Exception {
- BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
- System.out.println("Enter the decimal input below: ");
- int decInput = Integer.parseInt(br.readLine());
- System.out.println();
+ /**
+ * Converts a decimal number to a string representation in the specified base.
+ * For example, converting the decimal number 10 to base 2 would return "1010".
+ *
+ * @param decimal the decimal number to convert
+ * @param base the base to convert to (must be between {@value #MIN_BASE} and {@value #MAX_BASE})
+ * @return the string representation of the number in the specified base
+ * @throws IllegalArgumentException if the base is out of the supported range
+ */
+ public static String convertToAnyBase(int decimal, int base) {
+ if (base < MIN_BASE || base > MAX_BASE) {
+ throw new IllegalArgumentException("Base must be between " + MIN_BASE + " and " + MAX_BASE);
+ }
- System.out.println("Enter the base below: ");
- int base = Integer.parseInt(br.readLine());
- System.out.println();
+ if (decimal == 0) {
+ return String.valueOf(ZERO_CHAR);
+ }
- System.out.println("Decimal Input"
- + " is: " + decInput);
- System.out.println("Value of " + decInput + " in base " + base + " is: " + convertToAnyBase(decInput, base));
+ List digits = new ArrayList<>();
+ while (decimal > 0) {
+ digits.add(convertToChar(decimal % base));
+ decimal /= base;
+ }
- br.close();
+ StringBuilder result = new StringBuilder(digits.size());
+ for (int i = digits.size() - 1; i >= 0; i--) {
+ result.append(digits.get(i));
+ }
+
+ return result.toString();
}
/**
- * This method produces a String value of any given input decimal in any
- * base
+ * Converts an integer value to its corresponding character in the specified base.
+ * This method is used to convert values from 0 to 35 into their appropriate character representation.
+ * For example, 0-9 are represented as '0'-'9', and 10-35 are represented as 'A'-'Z'.
*
- * @param inp Decimal of which we need the value in base in String format
- * @return string format of the converted value in the given base
+ * @param value the integer value to convert (should be less than the base value)
+ * @return the character representing the value in the specified base
*/
- public static String convertToAnyBase(int inp, int base) {
- ArrayList charArr = new ArrayList<>();
-
- while (inp > 0) {
- charArr.add(reVal(inp % base));
- inp /= base;
- }
-
- StringBuilder str = new StringBuilder(charArr.size());
-
- for (Character ch : charArr) {
- str.append(ch);
- }
-
- return str.reverse().toString();
- }
-
- /**
- * This method produces character value of the input integer and returns it
- *
- * @param num integer of which we need the character value of
- * @return character value of input integer
- */
- public static char reVal(int num) {
- if (num >= 0 && num <= 9) {
- return (char) (num + '0');
+ private static char convertToChar(int value) {
+ if (value >= 0 && value <= 9) {
+ return (char) (ZERO_CHAR + value);
} else {
- return (char) (num - 10 + 'A');
+ return (char) (A_CHAR + value - DIGIT_OFFSET);
}
}
}
diff --git a/src/test/java/com/thealgorithms/conversions/DecimalToAnyBaseTest.java b/src/test/java/com/thealgorithms/conversions/DecimalToAnyBaseTest.java
new file mode 100644
index 000000000..04630b71c
--- /dev/null
+++ b/src/test/java/com/thealgorithms/conversions/DecimalToAnyBaseTest.java
@@ -0,0 +1,23 @@
+package com.thealgorithms.conversions;
+
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.CsvSource;
+
+public class DecimalToAnyBaseTest {
+
+ @ParameterizedTest
+ @CsvSource({"0, 2, 0", "0, 16, 0", "0, 36, 0", "10, 2, 1010", "255, 16, FF", "100, 8, 144", "42, 2, 101010", "1234, 16, 4D2", "1234, 36, YA"})
+ void testConvertToAnyBase(int decimal, int base, String expected) {
+ assertEquals(expected, DecimalToAnyBase.convertToAnyBase(decimal, base));
+ }
+
+ @Test
+ void testBaseOutOfRange() {
+ assertThrows(IllegalArgumentException.class, () -> DecimalToAnyBase.convertToAnyBase(10, 1));
+ assertThrows(IllegalArgumentException.class, () -> DecimalToAnyBase.convertToAnyBase(10, 37));
+ }
+}