patternjavaModerate
Division without / operator
Viewed 0 times
withoutdivisionoperator
Problem
I created a method that does division without the
/ operator. I believe this code is a bit slow and can be improved, but I am not sure how to do so. I'm not so good with shift operators (>> and >>>), but I believe that this will help a bit. How can I change my code to increase the speed of the division. I am open the changing my logic as well.public class DivisionReplace {
public static void divide(int N, int D) {
int result = 0;
if (D == 0) {
System.out.println("Cannot divide by 0");
}
else if (N == 0) {
System.out.println(0);
}
else if (N == D) {
System.out.println(1);
}
else if (N > 0 && D > 0 && N = D) {
N -= D;
result--;
}
System.out.println(result);
}
// both positive
else {
while (N >= D) {
N -= D;
result++;
}
System.out.println(result);
}
}
}
public static void main(String[] args) {
divide(-4,-10);
}
}Solution
A couple of comments first
It would be better to let your
The variables N and D are short and don't follow the Java naming conventions. Parameter names should start with a lowercase letter and use
If
You treat more special cases than you need to. I don't think you need to handle either
If you were doing divisions by a power of 2 (2, 4, 8, 16, etc.) you could use right shift
In the end, you are trying to re-implement division by using repetitive subtraction. It will be slow, no matter what you do. If you want to be possibly somewhat faster for bigger numbers, or want to try another approach (I can't promise you it will be faster, but I believe that for big enough numbers it will be significantly faster), you could try to implement division by using one of the good old "pen and paper" ways. Think about the division
However, in reality though, the fastest solution is to use the
It would be better to let your
divide method should return an int, not do the output to System.out itself. Do the output in main like this:public static void main(String[] args) {
System.out.println(divide(-4,-10));
}The variables N and D are short and don't follow the Java naming conventions. Parameter names should start with a lowercase letter and use
camelCase. I would recommend calling them numerator and denominator.If
denominator == 0 is a quite exceptional case, I would recommend throwing an ArithmeticException stating that it was caused by division by zero.You treat more special cases than you need to. I don't think you need to handle either
numerator == denominator or numerator == 0 as a special case. It should be possible to handle that using the normal logic for division.If you were doing divisions by a power of 2 (2, 4, 8, 16, etc.) you could use right shift
numerator >> 1, numerator >> 2 etc. However, your code should support more than just those cases which makes things more difficult.In the end, you are trying to re-implement division by using repetitive subtraction. It will be slow, no matter what you do. If you want to be possibly somewhat faster for bigger numbers, or want to try another approach (I can't promise you it will be faster, but I believe that for big enough numbers it will be significantly faster), you could try to implement division by using one of the good old "pen and paper" ways. Think about the division
303364 / 596. Try to solve that by hand! and think about what it is that you are doing. (Hint: Also think about how you do multiplications by hand, how would you solve 583 * 42 ?)However, in reality though, the fastest solution is to use the
/ operator in Java, but that wouldn't be a challenge now, would it? So I guess that's out of the question :)Code Snippets
public static void main(String[] args) {
System.out.println(divide(-4,-10));
}Context
StackExchange Code Review Q#48709, answer score: 14
Revisions (0)
No revisions yet.