Sunday, March 30, 2014

Implement *, -, and / operators using only +

Problem
Write a method to implement *, – , / operations You should use only the + operator.
Solution
IF we have 2 numbers a, b
  • a * b can be implemented as adding a for b times.Take care of overflow as a*b may result in overflow.
  • a – b can be implemented as addition of a and -b.
  • a / b can be implemented as finding how many times you need to add b, until getting a.
 Here is the solution in java:
public static int negate(int number) {
    return ~number + 1;
}
 
public static int abs(int number) {
    return number < 0 ? negate(number) : number;
}
 
public static int multiply(int a, int b) {
    int multiplier = Math.min(abs(a), abs(b));
    int multiplicant = (multiplier == abs(a) ? abs(b) : abs(a));
    if(multiplier==0 || multiplicant==0)
        return 0;
    int result = 0;
    for (int i = 0; i < multiplier; i = i + 1) {
        long holdResult = result+multiplicant;
        if(holdResult>Integer.MAX)
            throw new java.lang.ArithematicException("Overflow in integer");
        result = (int)holdResult;
    }
    if (abs(a) == a) { // a >= 0
        if (abs(b) == b) // b >= 0
            return result;
        else
            // b < 0;
            return negate(result);
    } else { // a < 0
        if (abs(b) == b) // b >= 0
            return negate(result);
        else
            // b < 0;
            return result;
    }
}
 
public static int substract(int a, int b) {
    return a + negate(b);
}
 
public static int divide(int a, int b) {
    if (b == 0) {
        throw new java.lang.ArithmeticException("Divide by 0.");
    }
 
    int divident = abs(a);
    int divisor = abs(b);
    int quotient = 0;
 
    while (divident >= divisor) {
        divident = substract(divident, divisor);
        quotient = quotient + 1;
    }
 
    if (abs(a) == a) { // a >= 0
        if (abs(b) == b) // b >= 0
            return quotient;
        else
            // b < 0;
            return negate(quotient);
    } else { // a < 0
        if (abs(b) == b) // b >= 0
            return negate(quotient);
        else
            // b < 0;
            return quotient;
    }
}

Thanks.

0 comments:

Post a Comment