public static String BigIntMultDif(String a, String b, int intLevel) {
        int k1 = a.length();
        int k2 = b.length();
        StringBuffer strLevel = new StringBuffer("\n");
        for (int i = 0; i < intLevel; i++) {
            strLevel.append("  ");
        }
        if (k1 < 4 && k2 < 4) {
            int intA = Integer.parseInt(a);
            int intB = Integer.parseInt(b);
            int intR = intA * intB;
            strProcess.append(strLevel).append(a).append(" * ").append(b).append(" = ").append(intR);
            return String.valueOf(intR);
        }
        if (k1 > k2) {
            return BigIntMultDif(b, a, intLevel);
        } else if (k1 == k2) {
            return BigIntMultSame(a, b, intLevel);
        }
        BigInteger p = BigInteger.ZERO;
        BigInteger r = p;
        int i = 0;
        strProcess.append(strLevel).append(a).append(" * ").append(b).append(" = ");
        for (; i < k2 - k1; i += k1) {
            String bi = b.substring(i, i + k1);
            strProcess.append(a).append("*").append(bi).append("*10^").append(k2 - k1 - i).append("+");
        }
        String bi = b.substring(i);
        strProcess.append(a).append("*").append(bi);

        for (i=0; i < k2 - k1; i += k1) {
            String bt = b.substring(i, i + k1);
            r = p.add(new BigInteger(BigIntMultSame(a, bt, intLevel+1) + cover(k2 - k1 - i)));
            p = r;
        }
        
        r = p.add(new BigInteger(BigIntMultDif(a, bi, intLevel+1)));
        strProcess.append(strLevel).append("  =").append(r);

        return r.toString();
    }