LeetCode: Divide Two Integers (Solution)

The link to the problem https://leetcode.com/problems/divide-two-integers

public class Solution
{
public int Divide(int dividend, int divisor)
{
var negative = IsResultNegative(dividend, divisor);
var dividendPositive = ToPositive(dividend);
var divisorPositive = ToPositive(divisor);
var resultPositive = DividePositive(dividendPositive, divisorPositive);
return FromPositive(resultPositive, negative);
}
private static uint ToPositive(int input)
{
if (input == int.MinValue)
{
return int.MaxValue + 1u;
}
return (uint)Math.Abs(input);
}
private static int FromPositive(uint input, bool toNegative)
{
var limit = toNegative ? int.MaxValue + 1u : int.MaxValue;
var result = input > limit ? limit : input;
return toNegative ? -(int)result : (int)result;
}
private static uint DividePositive(uint dividend, uint divisor, uint subResult = 0)
{
if (dividend < divisor)
return subResult;
var divisorTemp = divisor;
var newSubResult = 1u;
while (dividend >= divisorTemp << 1 && IsSafeToShiftLeft(divisorTemp))
{
divisorTemp <<= 1;
newSubResult <<= 1;
}
return DividePositive(dividend - divisorTemp, divisor, subResult + newSubResult);
}
private static bool IsSafeToShiftLeft(uint divisorTemp)
{
return divisorTemp < 0x80000000;
}
private static bool IsResultNegative(int dividend, int divisor)
{
return dividend < 0 ^ divisor < 0; // XOR operation
}
}

Fighting Complexity of a Simple Calculator App

Encouraged by Dmitry aka Senior Software Vlogger recently I read an interesting paper called “Out of the Tar Pit” by Ben Moseley and Peter Marks. Good 50% of the article is way over my head.

According to the paper the two most important ways of how complexity comes to our apps are State and Control. Control is order in which things happen inside app. State is variables that change what and in which order program does. Both of them make an app hard to understand hence to modify.

The less State and Control a computer program has the better. The simplest program “Hello world!” does not have State and has only one thing to do (console output of a hard-coded string).

That’s all right but the authors say that OOP (which I like a lot) does not help fighting complexity. And this conclusion surprised me because… it really does! I wanted to check the authors conclusion by practice.

Continue reading “Fighting Complexity of a Simple Calculator App”