How to multiply two long numbers in Java

2 Answers

0 votes
/** 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

*/

 



answered 4 days ago by avibootz
0 votes
/** Multiply Two Long Numbers
   ------------------------------------
   Implements manual big‑integer multiplication
   using decimal strings.
*/

public final class LongNumber {

    private final String value;

    public LongNumber(String v) {
        this.value = normalize(v);
    }

    public String getValue() {
        return value;
    }

    /** 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 LongNumber multiply(LongNumber other) {
        String a = this.value;
        String b = other.value;

        // Handle sign
        boolean sign = false;
        if (a.startsWith("-")) { sign = !sign; a = a.substring(1); }
        if (b.startsWith("-")) { sign = !sign; b = b.substring(1); }

        // If either is "0", return "0"
        if (a.equals("0") || b.equals("0")) {
            return new LongNumber("0");
        }

        int la = a.length();
        int lb = b.length();
        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 sb = new StringBuilder();
        int start = (digits[0] == 0 ? 1 : 0);

        for (int i = start; i < digits.length; i++) {
            sb.append((char) ('0' + digits[i]));
        }

        if (sign) {
            sb.insert(0, '-');
        }

        return new LongNumber(sb.toString());
    }

    private static String normalize(String s) {
        // Skip leading spaces
        s = s.stripLeading();

        // Remove leading zeros (but leave one zero)
        int i = 0;
        while (i < s.length() - 1 && s.charAt(i) == '0') {
            i++;
        }
        return s.substring(i);
    }

    @Override
    public String toString() {
        return value;
    }

    // Main
    public static void main(String[] args) {
        LongNumber a = new LongNumber(" 18361891827367132321");
        LongNumber b = new LongNumber("-18361891827367132321");

        LongNumber result = a.multiply(b);
        System.out.println(result);
    }
}


/*
run:

-337159071479931885857929667075122847041

*/

 



answered 4 days ago by avibootz
...