public static String multiply(String first, String second) {
        int l1 = first.length();
        int l2 = second.length();

        // Base Condition 1
        if (l1 == 0 || l2 == 0) {
            return "";
        }

        // Base Condition 2
        if (l1 == 1 && l2 == 1) {
            int result = atoi(first) * atoi(second);
            return String.valueOf(result);
        }

        int n = Math.max(l1, l2);
        int m = n / 2;

        int mid1 = (l1 - m) > 0 ? (l1 - m) : 0;
        String a = first.substring(0, mid1);
        String b = first.substring(mid1, l1);
        int mid2 = (l2 - m) > 0 ? (l2 - m) : 0;
        String c = second.substring(0, mid2);
        String d = second.substring(mid2, l2);
        String ac = multiply(a, c);
        String bd = multiply(b, d);
        String a_plus_b = String.valueOf(atobi(a).add(atobi(b)));
        String c_plus_d = String.valueOf(atobi(c).add(atobi(d)));
        BigInteger mul_a_plus_b_and_c_plus_d = atobi(multiply(a_plus_b, c_plus_d));
        BigInteger qBigInt = mul_a_plus_b_and_c_plus_d.subtract(atobi(ac)).subtract(new BigInteger(bd));

        String p = ac.concat(getZeros(2 * m));
        String q = String.valueOf(qBigInt).concat(getZeros(m));
        String r = bd;
        return String.valueOf(new BigInteger(p).add(new BigInteger(q)).add(new BigInteger(r)));
    }