我正在尝试对大于任何可用数据类型的数字执行整数除法

时间:2016-11-04 13:18:38

标签: java android biginteger

就大数字而言,我知道java BigInteger中有一个类可用,但我有一个约束,我不能使用它,我必须执行除法而不使用库。

这是我到目前为止所尝试的,但是内存泄漏问题并没有得到任何答案

private Integer getDivisionResult(ArrayList<Integer> first, ArrayList<Integer> second) {
    int firstLength = first.size();
    int secondLength = second.size();
    int counter = 0;
    if (firstLength < secondLength) {
        return counter;
    }
    do {
        int carry = 0, cursor1 = firstLength - 1, cursor2 = secondLength - 1;
        for (int i = firstLength - 1; i >= 0; i--, cursor1--, secondLength--) {
            int value = 0, from = 0;
            from = first.get(cursor1) - carry;
            if (from < (cursor2 < 0 ? 0 : second.get(cursor2))) {
                if (cursor1 > 0) {
                    from = 10 + from;
                }
                carry = 1;
            } else {
                carry = 0;
            }
            value = from - (cursor2 < 0 ? 0 : second.get(cursor2));
            first.set(i, value);
        }
        counter++;
    }while (isLesserThan(second,first));
    return counter;
}


private boolean isLesserThan(ArrayList<Integer> list, ArrayList<Integer> firstList) {
    boolean result = true;
    if (list.size() < firstList.size()) {
        return true;
    }
    for (int i = 0; i < list.size(); i++) {
        if (firstList.get(i) > list.get(i)) {
            result = true;
            break;
        } else if (firstList.get(i) == list.get(i)) {
            continue;
        } else {
            result = false;
            break;
        }
    }
    return result;
}

在传递某些错误情况后,我在此方法中调用了getDivisionResult:

 /**
 * @param numOne
 * @param numTwo
 * @return sign : true (negative) , false (positive)
 */
public Result getResult(String numOne, String numTwo) {
    Result result = new Result();
    int res = 0;
    boolean sign = false;
    ArrayList<Integer> firstNum;
    ArrayList<Integer> secondNum;
    if (isNegative(numOne)) {
        firstNum = getArray(numOne.substring(1));
        if (isNegative(numTwo)) {
            sign = false;
            secondNum = getArray(numTwo.substring(1));
        } else {
            secondNum = getArray(numTwo);
            sign = true;
        }
    } else {
        firstNum = getArray(numOne);
        if (isNegative(numTwo)) {
            sign = true;
            secondNum = getArray(numTwo.substring(1));
        } else {
            secondNum = getArray(numTwo);
        }
    }
    if (isNull(secondNum)) {
        result.setSign("Division by 0 is not permissable");
        result.setValue(res);
        return result;
    } else {
        if (isNull(firstNum)) {
            result.setSign("");
            result.setValue(res);
            return result;
        }
        firstNum = getNumberWithoutZeroes(firstNum);
        secondNum = getNumberWithoutZeroes(secondNum);
        res = getDivisionResult(firstNum, secondNum);
        if (sign) {
            result.setSign("-");
        } else {
            result.setSign("");
        }
        result.setValue(res);
    }
    return result;
}

private ArrayList<Integer> getNumberWithoutZeroes(ArrayList<Integer> num) {
    ArrayList<Integer> list = new ArrayList<>();
    for (Integer x : num) {
        if (x == 0) {
            continue;
        } else {
            list.add(x);
        }
    }
    return list;
}

private boolean isNegative(String num) {
    boolean result = false;
    if (num.startsWith("-")) {
        result = true;
    }
    return result;
}

private boolean isNull(ArrayList<Integer> num) {
    boolean result = true;
    for (Integer x : num) {
        if (x > 0) {
            result = false;
        }
    }
    return result;
}

private ArrayList<Integer> getArray(String num) {
    ArrayList<Integer> list = new ArrayList<>();
    char[] arr = num.toCharArray();
    for (int i = 0; i < num.length(); i++) {
        list.add(Integer.valueOf(arr[i]));
    }
    return list;
}

如果有人可以帮助我更好地解决我的问题,我将不胜感激

1 个答案:

答案 0 :(得分:0)

我已经解决了我自己的问题,但现在的问题是它的处理速度。