El problema es convertir el número binario dado (representado como string) a su número octal equivalente. La entrada podría ser muy grande y es posible que no encaje ni siquiera en int largo largo sin firmar.
Ejemplos:
Input : 110001110 Output : 616 Input : 1111001010010100001.010110110011011 Output : 1712241.26633
La idea es considerar la entrada binaria como una string de caracteres y luego seguir los pasos:
- Obtenga la longitud de la substring a la izquierda y a la derecha del punto decimal (‘.’) como left_len y right_len .
- Si left_len no es un múltiplo de 3, agregue un número mínimo de 0 al principio para que la longitud de la substring izquierda sea un múltiplo de 3.
- Si right_len no es un múltiplo de 3, agregue un número mínimo de 0 al final para que la longitud de la substring derecha sea un múltiplo de 3.
- Ahora, desde la izquierda, extraiga una por una las substrings de longitud 3 y agregue su código octal correspondiente al resultado.
- Si se encuentra un decimal (‘.’) en el medio, agréguelo al resultado.
C++
// C++ implementation to convert a binary number // to octal number #include <bits/stdc++.h> using namespace std; // function to create map between binary // number and its equivalent octal void createMap(unordered_map<string, char> *um) { (*um)["000"] = '0'; (*um)["001"] = '1'; (*um)["010"] = '2'; (*um)["011"] = '3'; (*um)["100"] = '4'; (*um)["101"] = '5'; (*um)["110"] = '6'; (*um)["111"] = '7'; } // Function to find octal equivalent of binary string convertBinToOct(string bin) { int l = bin.size(); int t = bin.find_first_of('.'); // length of string before '.' int len_left = t != -1 ? t : l; // add min 0's in the beginning to make // left substring length divisible by 3 for (int i = 1; i <= (3 - len_left % 3) % 3; i++) bin = '0' + bin; // if decimal point exists if (t != -1) { // length of string after '.' int len_right = l - len_left - 1; // add min 0's in the end to make right // substring length divisible by 3 for (int i = 1; i <= (3 - len_right % 3) % 3; i++) bin = bin + '0'; } // create map between binary and its // equivalent octal code unordered_map<string, char> bin_oct_map; createMap(&bin_oct_map); int i = 0; string octal = ""; while (1) { // one by one extract from left, substring // of size 3 and add its octal code octal += bin_oct_map[bin.substr(i, 3)]; i += 3; if (i == bin.size()) break; // if '.' is encountered add it to result if (bin.at(i) == '.') { octal += '.'; i++; } } // required octal number return octal; } // Driver program to test above int main() { string bin = "1111001010010100001.010110110011011"; cout << "Octal number = " << convertBinToOct(bin); return 0; }
Java
// Java implementation to convert a // binary number to octal number import java.io.*; import java.util.*; class GFG{ // Function to create map between binary // number and its equivalent hexadecimal static void createMap(Map<String, Character> um) { um.put("000", '0'); um.put("001", '1'); um.put("010", '2'); um.put("011", '3'); um.put("100", '4'); um.put("101", '5'); um.put("110", '6'); um.put("111", '7'); } // Function to find octal equivalent of binary static String convertBinToOct(String bin) { int l = bin.length(); int t = bin.indexOf('.'); // Length of string before '.' int len_left = t != -1 ? t : l; // Add min 0's in the beginning to make // left substring length divisible by 3 for(int i = 1; i <= (3 - len_left % 3) % 3; i++) bin = '0' + bin; // If decimal point exists if (t != -1) { // Length of string after '.' int len_right = l - len_left - 1; // add min 0's in the end to make right // substring length divisible by 3 for(int i = 1; i <= (3 - len_right % 3) % 3; i++) bin = bin + '0'; } // Create map between binary and its // equivalent octal code Map<String, Character> bin_oct_map = new HashMap<String, Character>(); createMap(bin_oct_map); int i = 0; String octal = ""; while (true) { // One by one extract from left, substring // of size 3 and add its octal code octal += bin_oct_map.get( bin.substring(i, i + 3)); i += 3; if (i == bin.length()) break; // If '.' is encountered add it to result if (bin.charAt(i) == '.') { octal += '.'; i++; } } // Required octal number return octal; } // Driver code public static void main(String[] args) { String bin = "1111001010010100001.010110110011011"; System.out.println("Octal number = " + convertBinToOct(bin)); } } // This code is contributed by jithin
Python3
# Python3 implementation to convert a binary number # to octal number # function to create map between binary # number and its equivalent octal def createMap(bin_oct_map): bin_oct_map["000"] = '0' bin_oct_map["001"] = '1' bin_oct_map["010"] = '2' bin_oct_map["011"] = '3' bin_oct_map["100"] = '4' bin_oct_map["101"] = '5' bin_oct_map["110"] = '6' bin_oct_map["111"] = '7' # Function to find octal equivalent of binary def convertBinToOct(bin): l = len(bin) # length of string before '.' t = -1 if '.' in bin: t = bin.index('.') len_left = t else: len_left = l # add min 0's in the beginning to make # left substring length divisible by 3 for i in range(1, (3 - len_left % 3) % 3 + 1): bin = '0' + bin # if decimal point exists if (t != -1): # length of string after '.' len_right = l - len_left - 1 # add min 0's in the end to make right # substring length divisible by 3 for i in range(1, (3 - len_right % 3) % 3 + 1): bin = bin + '0' # create dictionary between binary and its # equivalent octal code bin_oct_map = {} createMap(bin_oct_map) i = 0 octal = "" while (True) : # one by one extract from left, substring # of size 3 and add its octal code octal += bin_oct_map[bin[i:i + 3]] i += 3 if (i == len(bin)): break # if '.' is encountered add it to result if (bin[i] == '.'): octal += '.' i += 1 # required octal number return octal # Driver Code bin = "1111001010010100001.010110110011011" print("Octal number = ", convertBinToOct(bin)) # This code is contributed # by Atul_kumar_Shrivastava
C#
// C# implementation to convert a // binary number to octal number using System; using System.Collections.Generic; public class GFG{ // Function to create map between binary // number and its equivalent hexadecimal static void createMap(Dictionary<String, char> um) { um.Add("000", '0'); um.Add("001", '1'); um.Add("010", '2'); um.Add("011", '3'); um.Add("100", '4'); um.Add("101", '5'); um.Add("110", '6'); um.Add("111", '7'); } // Function to find octal equivalent of binary static String convertBinToOct(String bin) { int l = bin.Length; int t = bin.IndexOf('.'); int i = 0; // Length of string before '.' int len_left = t != -1 ? t : l; // Add min 0's in the beginning to make // left substring length divisible by 3 for(i = 1; i <= (3 - len_left % 3) % 3; i++) bin = '0' + bin; // If decimal point exists if (t != -1) { // Length of string after '.' int len_right = l - len_left - 1; // add min 0's in the end to make right // substring length divisible by 3 for(i = 1; i <= (3 - len_right % 3) % 3; i++) bin = bin + '0'; } // Create map between binary and its // equivalent octal code Dictionary<String, char> bin_oct_map = new Dictionary<String, char>(); createMap(bin_oct_map); i = 0; String octal = ""; while (true) { // One by one extract from left, substring // of size 3 and add its octal code octal += bin_oct_map[ bin.Substring(i, 3)]; i += 3; if (i == bin.Length) break; // If '.' is encountered add it to result if (bin[i] == '.') { octal += '.'; i++; } } // Required octal number return octal; } // Driver code public static void Main(String[] args) { String bin = "1111001010010100001.010110110011011"; Console.WriteLine("Octal number = " + convertBinToOct(bin)); } } // This code is contributed by 29AjayKumar
Javascript
<script> // Javascript implementation to convert a // binary number to octal number // Function to create map between binary // number and its equivalent hexadecimal function createMap(um) { um.set("000", '0'); um.set("001", '1'); um.set("010", '2'); um.set("011", '3'); um.set("100", '4'); um.set("101", '5'); um.set("110", '6'); um.set("111", '7'); } // Function to find octal equivalent of binary function convertBinToOct(bin) { let l = bin.length; let t = bin.indexOf('.'); // Length of string before '.' let len_left = t != -1 ? t : l; // Add min 0's in the beginning to make // left substring length divisible by 3 for(let i = 1; i <= (3 - len_left % 3) % 3; i++) bin = '0' + bin; // If decimal point exists if (t != -1) { // Length of string after '.' let len_right = l - len_left - 1; // add min 0's in the end to make right // substring length divisible by 3 for(let i = 1; i <= (3 - len_right % 3) % 3; i++) bin = bin + '0'; } // Create map between binary and its // equivalent octal code let bin_oct_map = new Map(); createMap(bin_oct_map); let i = 0; let octal = ""; while (true) { // One by one extract from left, substring // of size 3 and add its octal code octal += bin_oct_map.get(bin.substr(i, 3)); i += 3; if (i == bin.length) break; // If '.' is encountered add it to result if (bin.charAt(i) == '.') { octal += '.'; i++; } } // Required octal number return octal; } // Driver code let bin = "1111001010010100001.010110110011011"; document.write("Octal number = " + convertBinToOct(bin)); // This code is contributed by gfgking </script>
Producción:
Octal number = 1712241.26633
Complejidad de tiempo: O(n), donde n es la longitud de la string.
Este artículo es una contribución de Ayush Jauhari . Si te gusta GeeksforGeeks y te gustaría contribuir, también puedes escribir un artículo usando write.geeksforgeeks.org o enviar tu artículo por correo a review-team@geeksforgeeks.org. Vea su artículo que aparece en la página principal de GeeksforGeeks y ayude a otros Geeks.
Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
Publicación traducida automáticamente
Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA