Я возился с написанием класса, похожего на mpz (C) или BigInteger (Java). Это просто для удовольствия, поэтому, пожалуйста, не говорите, что я не должен писать свои собственные.
У меня есть класс, похожий на:
public class HugeInt
{
public List<Integer> digits;
public HugeInt(String value)
{
// convert string value into its seperate digits.
// store them in instance variable above
}
}
Теперь выполнить методы add () и subtract () этого класса довольно просто. Вот пример:
private List<Integer> add(List<Integer> a, List<Integer> b)
{
List<Integer> smallerDigits = (compareDigits(a,b) < 0) ? a : b;
List<Integer> largerDigits = (compareDigits(a,b) >= 0) ? a : b;
List<Integer> result = new ArrayList<Integer>();
int carry = 0;
for(int i = 0; i < largerDigits.size(); i++)
{
int num1 = largerDigits.get(i);
int num2 = (i < smallerDigits.size()) ? smallerDigits.get(i) : 0;
result.add((num1 + num2 + carry) % 10);
carry = ((num1 + num2 + carry) / 10);
}
if (carry != 0) result.add(carry);
return result;
}
Точно так же делать умножение было не так сложно.
Я вижу в википедии есть страница Алгоритмы деления , но я не уверен, какой из них подходит для того, что я пытаюсь сделать.
Поскольку эти положительные целые числа (представленные в виде цифр) могут быть произвольно длинными, я хочу убедиться, что я не пытаюсь выполнять какие-либо операции, кроме как за цифрой.
Однако, может ли кто-нибудь указать мне правильное направление для деления двух чисел, которые представлены как List<code><Integer
> ? Кроме того, я могу игнорировать остаток, так как это целочисленное деление.