diff --git a/src/main/java/com/thealgorithms/conversions/BinaryToOctal.java b/src/main/java/com/thealgorithms/conversions/BinaryToOctal.java index 6fef090287ab..5407c8525a23 100644 --- a/src/main/java/com/thealgorithms/conversions/BinaryToOctal.java +++ b/src/main/java/com/thealgorithms/conversions/BinaryToOctal.java @@ -1,27 +1,11 @@ package com.thealgorithms.conversions; -import java.util.Scanner; - -/** - * Converts any Binary number to an Octal Number - * - * @author Zachary Jones - */ public final class BinaryToOctal { - private BinaryToOctal() { - } + private static final int BITS_PER_OCTAL_DIGIT = 3; + private static final int BINARY_BASE = 2; + private static final int DECIMAL_BASE = 10; - /** - * Main method - * - * @param args Command line arguments - */ - public static void main(String[] args) { - Scanner sc = new Scanner(System.in); - System.out.println("Input the binary number: "); - int b = sc.nextInt(); - System.out.println("Octal equivalent: " + convertBinaryToOctal(b)); - sc.close(); + private BinaryToOctal() { } /** @@ -29,22 +13,33 @@ public static void main(String[] args) { * * @param binary The binary number * @return The octal number + * @throws IllegalArgumentException if the input is not a valid binary number */ public static String convertBinaryToOctal(int binary) { - String octal = ""; - int currBit = 0; - int j = 1; + if (binary == 0) { + return "0"; + } + + if (!String.valueOf(binary).matches("[01]+")) { + throw new IllegalArgumentException("Input is not a valid binary number."); + } + + StringBuilder octal = new StringBuilder(); + int currentBit; + int bitValueMultiplier = 1; + while (binary != 0) { - int code3 = 0; - for (int i = 0; i < 3; i++) { - currBit = binary % 10; - binary = binary / 10; - code3 += currBit * j; - j *= 2; + int octalDigit = 0; + for (int i = 0; i < BITS_PER_OCTAL_DIGIT && binary != 0; i++) { + currentBit = binary % DECIMAL_BASE; + binary /= DECIMAL_BASE; + octalDigit += currentBit * bitValueMultiplier; + bitValueMultiplier *= BINARY_BASE; } - octal = code3 + octal; - j = 1; + octal.insert(0, octalDigit); + bitValueMultiplier = 1; // Reset multiplier for the next group } - return octal; + + return octal.toString(); } } diff --git a/src/test/java/com/thealgorithms/conversions/BinaryToOctalTest.java b/src/test/java/com/thealgorithms/conversions/BinaryToOctalTest.java index c7018daecf23..98bd55a3d6c9 100644 --- a/src/test/java/com/thealgorithms/conversions/BinaryToOctalTest.java +++ b/src/test/java/com/thealgorithms/conversions/BinaryToOctalTest.java @@ -1,14 +1,24 @@ 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 BinaryToOctalTest { + @ParameterizedTest + @CsvSource({"0, 0", "1, 1", "10, 2", "111, 7", "1000, 10", "1111, 17", "110101, 65", "1010101, 125", "110110011, 663", "111111111, 777", "10010110, 226", "1011101, 135"}) + void testConvertBinaryToOctal(int binary, String expectedOctal) { + assertEquals(expectedOctal, BinaryToOctal.convertBinaryToOctal(binary)); + } + @Test - public void testBinaryToOctal() { - assertEquals("226", BinaryToOctal.convertBinaryToOctal(10010110)); - assertEquals("135", BinaryToOctal.convertBinaryToOctal(1011101)); + void testIncorrectInput() { + assertThrows(IllegalArgumentException.class, () -> BinaryToOctal.convertBinaryToOctal(1234)); + assertThrows(IllegalArgumentException.class, () -> BinaryToOctal.convertBinaryToOctal(102)); + assertThrows(IllegalArgumentException.class, () -> BinaryToOctal.convertBinaryToOctal(-1010)); } }