package com.kartik;
public class Multiplication {
public static final long multiplication(int a, int b) {
long result = ((long) a) * ((long) b);
return result;
}
public static final long multiplyUsingForLoop(int a, int b) {
int absoluteSecondData = Math.abs(b);
long result = a;
for (int i = 1; i < absoluteSecondData; i++) {
result += a;
}
return (b < 0) ? -result : result;
}
public static final long multiplyUsingRecursive(int a, int b) {
int absoluteSecondData = Math.abs(b);
long result = a;
if (absoluteSecondData == 1)
return result;
result += multiplyUsingRecursive(a, absoluteSecondData - 1);
return (b < 0) ? -result : result;
}
public static final long multiplyUsingShift(int a, int b) {
int absoluteFirstData = Math.abs(a);
int absoluteSecondData = Math.abs(b);
long result = 0L;
while (absoluteFirstData > 0) {
if ((absoluteFirstData & 1) > 0)
result += absoluteSecondData; // Is odd
absoluteFirstData >>= 1;
absoluteSecondData <<= 1;
}
return (a > 0 && b > 0 || a < 0 && b < 0) ? result : -result;
}
public static final long multiplyUsingLogirithms(int a, int b) {
long absoluteFirstData = Math.abs(a);
long absoluteSecondData = Math.abs(b);
long result = Math.round(Math.pow(10, (Math.log10(absoluteFirstData) + Math.log10(absoluteSecondData))));
return (a > 0 && b > 0 || a < 0 && b < 0) ? result : -result;
}
}
public class Multiplication {
public static final long multiplication(int a, int b) {
long result = ((long) a) * ((long) b);
return result;
}
public static final long multiplyUsingForLoop(int a, int b) {
int absoluteSecondData = Math.abs(b);
long result = a;
for (int i = 1; i < absoluteSecondData; i++) {
result += a;
}
return (b < 0) ? -result : result;
}
public static final long multiplyUsingRecursive(int a, int b) {
int absoluteSecondData = Math.abs(b);
long result = a;
if (absoluteSecondData == 1)
return result;
result += multiplyUsingRecursive(a, absoluteSecondData - 1);
return (b < 0) ? -result : result;
}
public static final long multiplyUsingShift(int a, int b) {
int absoluteFirstData = Math.abs(a);
int absoluteSecondData = Math.abs(b);
long result = 0L;
while (absoluteFirstData > 0) {
if ((absoluteFirstData & 1) > 0)
result += absoluteSecondData; // Is odd
absoluteFirstData >>= 1;
absoluteSecondData <<= 1;
}
return (a > 0 && b > 0 || a < 0 && b < 0) ? result : -result;
}
public static final long multiplyUsingLogirithms(int a, int b) {
long absoluteFirstData = Math.abs(a);
long absoluteSecondData = Math.abs(b);
long result = Math.round(Math.pow(10, (Math.log10(absoluteFirstData) + Math.log10(absoluteSecondData))));
return (a > 0 && b > 0 || a < 0 && b < 0) ? result : -result;
}
}