diff --git a/.project b/.project index 3cd55b5c..86e73f4a 100644 --- a/.project +++ b/.project @@ -14,4 +14,15 @@ org.eclipse.jdt.core.javanature + + + 1730486790075 + + 30 + + org.eclipse.core.resources.regexFilterMatcher + node_modules|\.git|__CREATED_BY_JAVA_LANGUAGE_SERVER__ + + + diff --git a/src/com/jwetherell/algorithms/mathematics/Division.class b/src/com/jwetherell/algorithms/mathematics/Division.class new file mode 100644 index 00000000..9f83cecf Binary files /dev/null and b/src/com/jwetherell/algorithms/mathematics/Division.class differ diff --git a/src/com/jwetherell/algorithms/mathematics/Division.java b/src/com/jwetherell/algorithms/mathematics/Division.java index c133f741..397e7bbe 100644 --- a/src/com/jwetherell/algorithms/mathematics/Division.java +++ b/src/com/jwetherell/algorithms/mathematics/Division.java @@ -4,54 +4,75 @@ public class Division { public static final long division(int a, int b) { long result = ((long) a) / ((long) b); + + if (b == 0) { + throw new IllegalArgumentException ("Divisor cannot be 0"); + } + else { return result; + } } public static final long divisionUsingLoop(int a, int b) { int absA = Math.abs(a); int absB = Math.abs(b); - long temp = absA; - long result = 0; - while (temp >= 0) { - temp -= absB; - if (temp >= 0) - result++; - } - return (a > 0 && b > 0 || a < 0 && b < 0) ? result : -result; + if (b == 0) { + throw new IllegalArgumentException ("Divisor cannot be 0"); + } + else { + long temp = absA; + long result = 0; + while (temp >= 0) { + temp -= absB; + if (temp >= 0) + result++; + } + return (a > 0 && b > 0 || a < 0 && b < 0) ? result : -result; + } } public static final long divisionUsingRecursion(int a, int b) { int absA = Math.abs(a); int absB = Math.abs(b); - long result = 1; - int diff = absA - absB; - if (diff > 0 && diff <= 1) { - return result; - } else if (diff < 0) { - return 0; - } + if (b == 0) { + throw new IllegalArgumentException ("Divisor cannot be 0"); + } + else { + long result = 1; + int diff = absA - absB; + if (diff > 0 && diff <= 1) { + return result; + } else if (diff < 0) { + return 0; + } - result += divisionUsingRecursion(diff, absB); - return (a > 0 && b > 0 || a < 0 && b < 0) ? result : -result; + result += divisionUsingRecursion(diff, absB); + return (a > 0 && b > 0 || a < 0 && b < 0) ? result : -result; + } } public static final long divisionUsingMultiplication(int a, int b) { int absA = Math.abs(a); int absB = Math.abs(b); - int temp = absB; - int counter = 0; - while (temp <= absA) { - temp = temp << 1; - counter++; - } - absA -= absB << (counter - 1); - long result = (long) Math.pow(2, counter - 1); - if (absB <= absA) - result += divisionUsingMultiplication(absA, absB); - return (a > 0 && b > 0 || a < 0 && b < 0) ? result : -result; + if (b == 0) { + throw new IllegalArgumentException ("Divisor cannot be 0"); + } + else { + int temp = absB; + int counter = 0; + while (temp <= absA) { + temp = temp << 1; + counter++; + } + absA -= absB << (counter - 1); + long result = (long) Math.pow(2, counter - 1); + if (absB <= absA) + result += divisionUsingMultiplication(absA, absB); + return (a > 0 && b > 0 || a < 0 && b < 0) ? result : -result; + } } public static final long divisionUsingShift(int a, int b) { @@ -59,29 +80,40 @@ public static final long divisionUsingShift(int a, int b) { int absB = Math.abs(b); int tempA, tempB, counter; - long result = 0L; - while (absA >= absB) { - tempA = absA >> 1; // Right shift "a" - tempB = absB; - counter = 1; - while (tempA >= tempB) { // Double "tempB" until it's larger than - // "tempA" - tempB <<= 1; - counter <<= 1; // Double the counter - } - absA -= tempB; // Subtract "tempB" from "a" - result += counter; // Add counter (2^number of left shifts) - } - return (a > 0 && b > 0 || a < 0 && b < 0) ? result : -result; + if (b == 0) { + throw new IllegalArgumentException ("Divisor cannot be 0"); + } + else { + long result = 0L; + while (absA >= absB) { + tempA = absA >> 1; // Right shift "a" + tempB = absB; + counter = 1; + while (tempA >= tempB) { // Double "tempB" until it's larger than + // "tempA" + tempB <<= 1; + counter <<= 1; // Double the counter + } + absA -= tempB; // Subtract "tempB" from "a" + result += counter; // Add counter (2^number of left shifts) + } + return (a > 0 && b > 0 || a < 0 && b < 0) ? result : -result; + } } public static final long divisionUsingLogs(int a, int b) { long absA = Math.abs(a); long absB = Math.abs(b); - double logBase10A = Math.log10(absA); - double logBase10B = Math.log10(absB); - double powOf10 = Math.pow(10, (logBase10A - logBase10B)); - long result = (long) Math.floor(powOf10); - return (a > 0 && b > 0 || a < 0 && b < 0) ? result : -result; + + if (b == 0) { + throw new IllegalArgumentException ("Divisor cannot be 0"); + } + else { + double logBase10A = Math.log10(absA); + double logBase10B = Math.log10(absB); + double powOf10 = Math.pow(10, (logBase10A - logBase10B)); + long result = (long) Math.floor(powOf10); + return (a > 0 && b > 0 || a < 0 && b < 0) ? result : -result; + } } }