/** Multiply Two Long Numbers
------------------------------------
Implements manual big‑integer multiplication
using decimal strings.
*/
public class MultiplyTwoLongNumbers {
/** Multiply two integer strings a * b and return the result as a string.
Caller receives a normal Java String.
No aliasing issues because Strings are immutable. */
public static String longmulti(String A, String B) {
// Skip leading spaces
A = A.stripLeading();
B = B.stripLeading();
// Handle sign
boolean sign = false;
if (A.startsWith("-")) {
sign = !sign;
A = A.substring(1);
}
if (B.startsWith("-")) {
sign = !sign;
B = B.substring(1);
}
// Skip leading zeros
A = stripLeadingZeros(A);
B = stripLeadingZeros(B);
// If either is "0", return "0"
if (A.equals("0") || B.equals("0")) {
return "0";
}
int la = A.length();
int lb = B.length();
// Initialize result buffer with zeros
int[] digits = new int[la + lb];
// Multiply from right to left
for (int i = la - 1; i >= 0; i--) {
char ca = A.charAt(i);
if (!Character.isDigit(ca)) continue;
for (int j = lb - 1; j >= 0; j--) {
char cb = B.charAt(j);
if (!Character.isDigit(cb)) continue;
int pos = i + j + 1;
int sum = digits[pos] +
(ca - '0') * (cb - '0');
digits[pos] = sum % 10;
digits[pos - 1] += sum / 10;
}
}
// Convert digits[] to string, skipping leading zero
StringBuilder result = new StringBuilder();
int start = (digits[0] == 0 ? 1 : 0);
for (int i = start; i < digits.length; i++) {
result.append((char) ('0' + digits[i]));
}
// Add sign if needed
if (sign) {
result.insert(0, '-');
}
return result.toString();
}
private static String stripLeadingZeros(String s) {
int i = 0;
while (i < s.length() - 1 && s.charAt(i) == '0') {
i++;
}
return s.substring(i);
}
public static void main(String[] args) {
String r = longmulti(
" 18361891827367132321",
"-18361891827367132321"
);
System.out.println(r);
}
}
/*
run:
-337159071479931885857929667075122847041
*/