如何逐个数字地执行程序中的除法?

时间:2010-02-25 23:30:18

标签: c# java math division integer-division

我正在编写类似于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;
    }

同样,做倍增也不是那么难。

我在维基百科上看到Division Algorithms上有一个页面,但我不确定哪一个适合我正在尝试做的事情。

因为这些正整数(表示为数字)可以任意长,所以我想确保我不会尝试对除数字以外的任何操作进行任何操作。

但是,有人能指出我正确的方向来划分两个代表List<Integer>的数字吗?另外,我可以忽略余数,因为这是整数除法。

4 个答案:

答案 0 :(得分:5)

你可以做long division,但这肯定不是最好的方法(编辑:虽然看起来像这样的东西是一个很好的方法) 。您可以查看other implementations大整数库,并且Googling会发现一些有用的信息。

答案 1 :(得分:2)

这可能是一种轻微的矫枉过正,但如果这是你为了好玩而做的事情,你会喜欢阅读: http://www.fizyka.umk.pl/nrbook/c20-6.pdf (这是“C中数值配方”中的“任意精度算术”)。 非常有趣,正如本书的大部分内容一样,有很好的解释和很多代码。

答案 2 :(得分:0)

因为我假设你只是处理整数除法,所以不是很难。乘法是重复加法,除法是相反的 - 重复减法。那么你要做的就是检查你可以从被除数中减去除数的次数。例如,3可以从10减去3次而不会<0,因此整数除法商为3.

答案 3 :(得分:0)

本文A Larger Integer没有说明如何为“较大的整数”实现逐位运算,但它确实展示了如何根据两种Int64类型实现一个(显然是完全正常的)128位整数。我想,扩展使用Int64类型数组的方法来产生一个任意长度的整数并不太难。我只花了几分钟回顾一下这篇文章,并且乘法的实现看起来很可能涉及任意长度。

本文介绍了如何使用binary division实现除法(商和余数)。