Norway


Given a two integers say a and b. Find the quotient after diving a by b without using , and .

Input : a = 10, b = 3
Output : 3

Input : a = 43, b = -8
Output :  -5

Approach : Keep subtracting the divisor from dividend until dividend becomes less than divisor. The dividend becomes the remainder, and the number of times subtraction is done becomes the quotient. Below is the implementation of above approach :

// C++ implementation to  two
// integers without using multiplication,
// division and mod operator
#include <bits/stdc++.h>
using namespace std;

// Function to  a by b and
// return floor value it
int (int dividend, int divisor) {

  // Calculate sign of divisor i.e.,
  // sign will be negative only iff
  // either one of them is negative
  // otherwise it will be positive
  int sign = ((dividend < 0) ^ (divisor < 0)) ? -1 : 1;

  // Update both divisor and
  // dividend positive
  dividend = abs(dividend);
  divisor = abs(divisor);

  // Initialize the quotient
  int quotient = 0;
  while (dividend >= divisor) {
    dividend -= divisor;
    ++quotient;
  }

  return sign * quotient;
}

// Driver code
int main() {
  int a = 10, b = 3;
  cout << (a, b) << "n";

  a = 43, b = -8;
  cout << (a, b);

  return 0;
}

Output :

3
-5

complexity : O(a)
Auxiliary space : O(1)

Efficient Approach : Use bit manipulation in order to find the quotient. The divisor and dividend can be written as

dividend = quotient * divisor + remainder

As every number can be represented in base (0 or 1), represent the quotient in binary form by using shift operator as given below :

  1. Determine the most significant bit in the quotient. This can easily be calculated by iterating on the bit position i from 31 to 1.
  2. Find the first bit for which divisor << i  - quicklatex - Divide two integers without using multiplication, division and mod operator is less than dividend and keep updating the ith bit position for which it is true.
  3. Add the result in temp for checking the next position such that (temp + (divisor << i) ) is less than dividend.
  4. Return the final answer of quotient after updating with corresponding sign.

Below is the implementation of above approach :

// C++ implementation to Divide two
// integers without using multiplication,
// division and mod operator
#include <bits/stdc++.h>
using namespace std;

// Function to divide a by b and
// return floor value it
int divide(long long dividend, long long divisor) {

  // Calculate sign of divisor i.e.,
  // sign will be negative only iff
  // either one of them is negative
  // otherwise it will be positive
  int sign = ((dividend < 0) ^ (divisor < 0)) ? -1 : 1;

  // remove sign of operands
  dividend = abs(dividend);
  divisor = abs(divisor);

  // Initialize the quotient
  long long quotient = 0, temp = 0;

  // test down from the highest bit and
  // accumulate the tentative value for
  // valid bit
  for (int i = 31; i >= 0; --i) {

    if (temp + (divisor << i) <= dividend) {
      temp += divisor << i;
      quotient |= 1LL << i;
    }
  }

  return sign * quotient;
}

// Driver code
int main() {
  int a = 10, b = 3;
  cout << divide(a, b) << "n";

  a = 43, b = -8;
  cout << divide(a, b);

  return 0;
}

Output :

3
-5

Time complexity : O(log(a))
Auxiliary space : O(1)


- avatar - Divide two integers without using multiplication, division and mod operator

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.



Source link

LEAVE A REPLY

Please enter your comment!
Please enter your name here