Open In App

Decimal to octal conversion with minimum use of arithmetic operators

Last Updated : 25 Sep, 2022
Improve
Improve
Like Article
Like
Save
Share
Report

Given a decimal number n without floating-point. The problem is to convert the decimal number to octal number with minimum use of arithmetic operators. 

Examples: 

Input : n = 10
Output : 12 
12 is octal equivalent of decimal 10.

Input : n = 151
Output : 227

Approach: Following are the steps:

  1. Perform decimal to binary conversion without using arithmetic operators of the given number n. Refer this post. Let this number be bin.
  2. Convert the binary number bin to octal. Refer this post.

C++




// C++ implementation of decimal to octal conversion
// with minimum use of arithmetic operators
#include <bits/stdc++.h>
 
using namespace std;
 
// function for decimal to binary conversion
// without using arithmetic operators
string decToBin(int n)
{
    if (n == 0)
        return "0";
      
    // to store the binary equivalent of decimal
    string bin = "";   
    while (n > 0)   
    {
        // to get the last binary digit of the
        // number 'n' and accumulate it at the
        // beginning of 'bin'
        bin = ((n & 1) == 0 ? '0' : '1') + bin;
          
        // right shift 'n' by 1
        n >>= 1;
    }
      
    // required binary number
    return bin;
}
 
  
// Function to find octal equivalent of binary
string convertBinToOct(string bin)
{
    int l = bin.size();
          
    // add min 0's in the beginning to make
    // string length divisible by 3
    for (int i = 1; i <= (3 - l % 3) % 3; i++)
        bin = '0' + bin;
       
    // create map between binary and its
    // equivalent octal code
    unordered_map<string, char> 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'
       
    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;       
    }
       
    // required octal number
    return octal;   
}
 
// function to find octal equivalent of decimal
string decToOctal(int n)
{
    // convert decimal to binary
    string bin = decToBin(n);
     
    // convert binary to octal
    // required octal equivalent of decimal
    return convertBinToOct(bin);
}
 
// Driver program to test above
int main()
{
    int n = 151;
    cout << decToOctal(n);
    return 0;
}


Java




// Java implementation of decimal to octal
// conversion with minimum use of
// arithmetic operators
import java.util.*;
 
class GFG
{
 
// function for decimal to binary conversion
// without using arithmetic operators
static String decToBin(int n)
{
    if (n == 0)
        return "0";
     
    // to store the binary equivalent of decimal
    String bin = "";
    while (n > 0)
    {
        // to get the last binary digit of the
        // number 'n' and accumulate it at the
        // beginning of 'bin'
        bin = ((n & 1) == 0 ? '0' : '1') + bin;
         
        // right shift 'n' by 1
        n >>= 1;
    }
     
    // required binary number
    return bin;
}
 
// Function to find octal equivalent of binary
static String convertBinToOct(String bin)
{
    int l = bin.length();
         
    // add min 0's in the beginning to make
    // string length divisible by 3
    for (int i = 1; i <= (3 - l % 3) % 3; i++)
        bin = '0' + bin;
         
    // create map between binary and its
    // equivalent octal code
    Map<String,
        Character> bin_oct_map = new HashMap<>();
    bin_oct_map.put("000", '0');
    bin_oct_map.put("001", '1');
    bin_oct_map.put("010", '2');
    bin_oct_map.put("011", '3');
    bin_oct_map.put("100", '4');
    bin_oct_map.put("101", '5');
    bin_oct_map.put("110", '6');
    bin_oct_map.put("111", '7');
         
    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;    
    }
         
    // required octal number
    return octal;
}
 
// function to find octal equivalent of decimal
static String decToOctal(int n)
{
    // convert decimal to binary
    String bin = decToBin(n);
     
    // convert binary to octal
    // required octal equivalent of decimal
    return convertBinToOct(bin);
}
 
// Driver Code
public static void main(String[] args)
{
    int n = 151;
    System.out.println(decToOctal(n));
}
}
 
// This code is contributed by Rajput-Ji


Python3




# Python3 implementation of decimal to octal conversion
# with minimum use of arithmetic operators
 
# function for decimal to binary conversion
# without using arithmetic operators
def decToBin(n):
 
    if (n == 0):
        return "0"
 
    # to store the binary equivalent of decimal
    bin = ""
     
    while (n > 0):
     
        # to get the last binary digit of the
        # number 'n' and accumulate it at the
        # beginning of 'bin'
        bin = ('0' if(n & 1) == 0 else '1') + bin
 
        # right shift 'n' by 1
        n >>= 1
 
    # required binary number
    return bin
 
# Function to find octal equivalent of binary
def convertBinToOct(bin):
 
    l = len(bin)
 
    # add min 0's in the beginning to make
    # string length divisible by 3
    for i in range(1,((3 - l % 3) % 3) + 1):
        bin = '0' + bin
 
    # create map between binary and its
    # equivalent octal code
     
    bin_oct_map = dict()
     
    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'
 
    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
     
    # required octal number
    return octal
 
# function to find octal equivalent of decimal
def decToOctal(n):
 
    # convert decimal to binary
    bin = decToBin(n)
 
    # convert binary to octal
    # required octal equivalent of decimal
    return convertBinToOct(bin)
 
# Driver program to test above
if __name__=='__main__':
 
    n = 151
    print(decToOctal(n))
     
# This code is contributed by pratham76


C#




// C# implementation of decimal to octal
// conversion with minimum use of
// arithmetic operators
using System;
using System.Collections.Generic;
 
class GFG{
  
// Function for decimal to binary
// conversion without using
// arithmetic operators
static string decToBin(int n)
{
    if (n == 0)
        return "0";
      
    // To store the binary equivalent
    // of decimal
    string bin = "";
    while (n > 0)
    {
         
        // To get the last binary digit of the
        // number 'n' and accumulate it at the
        // beginning of 'bin'
        bin = ((n & 1) == 0 ? '0' : '1') + bin;
          
        // Right shift 'n' by 1
        n >>= 1;
    }
     
    // Required binary number
    return bin;
}
  
// Function to find octal equivalent of binary
static string convertBinToOct(string bin)
{
    int l = bin.Length;
          
    // Add min 0's in the beginning to make
    // string length divisible by 3
    for(int j = 1; j <= (3 - l % 3) % 3; j++)
        bin = '0' + bin;
          
    // Create map between binary and its
    // equivalent octal code
    Dictionary<string,
               char> bin_oct_map = new Dictionary<string,
                                                  char>();
     
    bin_oct_map.Add("000", '0');
    bin_oct_map.Add("001", '1');
    bin_oct_map.Add("010", '2');
    bin_oct_map.Add("011", '3');
    bin_oct_map.Add("100", '4');
    bin_oct_map.Add("101", '5');
    bin_oct_map.Add("110", '6');
    bin_oct_map.Add("111", '7');
          
    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[bin.Substring(i, 3)];
        i += 3;
         
        if (i == bin.Length)
            break;    
    }
          
    // Required octal number
    return octal;
}
  
// Function to find octal equivalent of decimal
static string decToOctal(int n)
{
     
    // Convert decimal to binary
    string bin = decToBin(n);
      
    // Convert binary to octal
    // required octal equivalent
    // of decimal
    return convertBinToOct(bin);
}
  
// Driver Code
public static void Main(string[] args)
{
    int n = 151;
     
    Console.Write(decToOctal(n));
}
}
 
// This code is contributed by rutvik_56


Javascript




<script>
 
// Javascript implementation of decimal to octal conversion
// with minimum use of arithmetic operators
 
// function for decimal to binary conversion
// without using arithmetic operators
function decToBin(n)
{
    if (n == 0)
        return "0";
      
    // to store the binary equivalent of decimal
    var bin = "";   
    while (n > 0)   
    {
        // to get the last binary digit of the
        // number 'n' and accumulate it at the
        // beginning of 'bin'
        bin = ((n & 1) == 0 ? '0' : '1') + bin;
          
        // right shift 'n' by 1
        n >>= 1;
    }
      
    // required binary number
    return bin;
}
 
  
// Function to find octal equivalent of binary
function convertBinToOct(bin)
{
    var l = bin.length;
          
    // add min 0's in the beginning to make
    // string length divisible by 3
    for (var i = 1; i <= (3 - l % 3) % 3; i++)
        bin = '0' + bin;
       
    // create map between binary and its
    // equivalent octal code
    var bin_oct_map = new Map();
    bin_oct_map.set("000",'0');
    bin_oct_map.set("001",'1');
    bin_oct_map.set("010",'2');
    bin_oct_map.set("011",'3');
    bin_oct_map.set("100",'4');
    bin_oct_map.set("101",'5');
    bin_oct_map.set("110",'6');
    bin_oct_map.set("111",'7');
       
    var i = 0;
    var octal = "";     
    while (1)
    {
        // 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;       
    }
       
    // required octal number
    return octal;   
}
 
// function to find octal equivalent of decimal
function decToOctal(n)
{
    // convert decimal to binary
    var bin = decToBin(n);
     
    // convert binary to octal
    // required octal equivalent of decimal
    return convertBinToOct(bin);
}
 
// Driver program to test above
var n = 151;
document.write( decToOctal(n));ing
 
// This code is contributed by itsok.
</script>


Output

227

Time Complexity: O(n), where n is the length of the binary string.
Auxiliary Space: O(n) because using extra space for string octal



Like Article
Suggest improvement
Previous
Next
Share your thoughts in the comments

Similar Reads