📌  相关文章
📜  将两个整数相除而不使用乘法,除法和mod运算符|套装2

📅  最后修改于: 2021-05-06 23:47:49             🧑  作者: Mango

给定两个整数,则说a和b。将a除以b后不使用乘法,除法和mod运算符。
例子:

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

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

这个问题已经在这里讨论过了。在这篇文章中,讨论了一种不同的方法。
方法 :

  1. 令a / b = c。
  2. 记录双方
  3. log(a)– log(b)= log(c)
  4. 现在,RHS的日志可以在LHS中写为exp
  5. 最终公式为: exp(log(a)– log(b))= c
C++
// C++ program for above approach
#include 
using namespace std;
 
// Returns the quotient of dividend/divisor.
void Divide(int a, int b)
{
    long long dividend = (long long)a;
    long long divisor = (long long)b;
 
    // Calculate sign of divisor i.e.,
    // sign will be negative only if
    // either one of them is negative
    // otherwise it will be positive
 
    long long sign = (dividend < 0) ^ (divisor < 0) ? -1 : 1;
 
    // Remove signs of dividend and divisor
    dividend = abs(dividend);
    divisor = abs(divisor);
 
    // Zero division Exception.
    if (divisor == 0) {
        cout << "Cannot Divide by 0" << endl;
        return;
    }
 
    if (dividend == 0) {
        cout << a << " / " << b << " is equal to : "
             << 0 << endl;
        return;
    }
 
    if (divisor == 1) {
        cout << a << " / " << b << " is equal to : "
             << sign * dividend << endl;
        return;
    }
 
    // Using Formula derived above.
    cout << a << " / " << b << " is equal to : "
         << sign * exp(log(dividend) - log(divisor))
         << endl;
}
 
// Drivers code
int main()
{
    int a = 10, b = 5;
 
    Divide(a, b);
 
    a = 49, b = -7;
    Divide(a, b);
 
    return 0;
}


Java
// Java program for
// above approach
import java.io.*;
 
class GFG
{
static void Divide(int a, int b)
{
    long dividend = (long)a;
    long divisor = (long)b;
 
    // Calculate sign of divisor i.e.,
    // sign will be negative only if
    // either one of them is negative
    // otherwise it will be positive
 
    long sign = (dividend < 0) ^
                (divisor < 0) ? -1 : 1;
 
    // Remove signs of
    // dividend and divisor
    dividend = Math.abs(dividend);
    divisor = Math.abs(divisor);
 
    // Zero division Exception.
    if (divisor == 0)
    {
        System.out.println("Cannot Divide by 0");
        return;
    }
 
    if (dividend == 0)
    {
        System.out.println(a + " / " + b +
                            " is equal to : " + 0);
        return;
    }
 
    if (divisor == 1)
    {
        System.out.println(a + " / " + b +
                           " is equal to : " +
                             sign * dividend);
        return;
    }
 
    // Using Formula
    // derived above.
    System.out.println(a + " / " + b + " is equal to : " +
                                         Math.floor(sign *
                            (Math.exp(Math.log(dividend) -
                             Math.log(divisor)))));
}
 
// Driver code
public static void main (String[] args)
{
int a = 10, b = 5;
 
Divide(a, b);
 
a = 49; b = -7;
Divide(a, b);
}
}
 
// This code is contributed
// by shiv_bhakt.


Python3
# Python3 program
# for above approach
import math
def Divide(a, b):
    dividend = a;
    divisor = b;
 
    # Calculate sign of divisor
    # i.e., sign will be negative
    # only if either one of them
    # is negative otherwise it
    # will be positive
 
    sign = -1 if ((dividend < 0) ^
                  (divisor < 0)) else 1;
 
    # Remove signs of
    # dividend and divisor
    dividend = abs(dividend);
    divisor = abs(divisor);
 
    # Zero division Exception.
    if (divisor == 0):
        print("Cannot Divide by 0");
 
    if (dividend == 0):
        print(a, "/", b, "is equal to :", 0);
 
    if (divisor == 1):
        print(a, "/", b, "is equal to :",
                      (sign * dividend));
 
    # Using Formula
    # derived above.
    print(a, "/", b, "is equal to :",
          math.floor(sign * math.exp(math.log(dividend) -
                                     math.log(divisor))));
 
# Driver code
a = 10;
b = 5;
 
Divide(a, b);
 
a = 49;
b = -7;
Divide(a, b);
 
# This code is contributed
# by mits


C#
// C# program for
// above approach
using System;
 
class GFG
{
static void Divide(int a, int b)
{
    long dividend = (long)a;
    long divisor = (long)b;
 
    // Calculate sign of divisor
    // i.e., sign will be negative
    // only if either one of them
    // is negative otherwise it
    // will be positive
 
    long sign = (dividend < 0) ^
                (divisor < 0) ? -1 : 1;
 
    // Remove signs of
    // dividend and divisor
    dividend = Math.Abs(dividend);
    divisor = Math.Abs(divisor);
 
    // Zero division Exception.
    if (divisor == 0)
    {
        Console.WriteLine("Cannot Divide by 0");
        return;
    }
 
    if (dividend == 0)
    {
        Console.WriteLine(a + " / " + b +
                          " is equal to : " + 0);
        return;
    }
 
    if (divisor == 1)
    {
        Console.WriteLine(a + " / " + b +
                          " is equal to : " +
                            sign * dividend);
        return;
    }
 
    // Using Formula
    // derived above.
    Console.WriteLine(a + " / " + b + " is equal to : " +
                                        Math.Floor(sign *
                           (Math.Exp(Math.Log(dividend) -
                                   Math.Log(divisor)))));
}
 
// Driver code
public static void Main ()
{
    int a = 10, b = 5;
     
    Divide(a, b);
     
    a = 49; b = -7;
    Divide(a, b);
}
}
 
// This code is contributed
// by shiv_bhakt.


PHP


Javascript


输出:
10 / 5 is equal to : 2
49 / -7 is equal to : -7